দিক অনুপাত রাখতে ইমেজভিউতে কোনও চিত্র কীভাবে স্কেল করবেন


526

অ্যান্ড্রয়েডে, আমি একটি সংজ্ঞায়িত করেছি ImageView 's layout_widthহতে fill_parent(যা ফোন পুরো প্রস্থ পর্যন্ত সময় নেয়)।

আমি যদি ছবিটি রাখি ImageView যদি এর চেয়ে বড় হয় তবে layout_widthঅ্যান্ড্রয়েড এটি স্কেল করবে, তাই না? তবে উচ্চতার কী হবে? অ্যান্ড্রয়েড যখন চিত্রটি স্কেল করে, তখন এটি অনুপাতের অনুপাত রাখবে?

আমি যেটা সন্ধান করেছি তা হ'ল ImageViewঅ্যান্ড্রয়েড যখন কোনও চিত্রকে বড় করে তোলে তার নীচে এবং নীচে কিছুটা সাদা জায়গা থাকে ImageView। এটা কি সত্যি? যদি হ্যাঁ, তবে আমি কীভাবে সেই সাদা স্থানটি দূর করতে পারি?

উত্তর:


799
  1. হ্যাঁ, ডিফল্টরূপে অ্যান্ড্রয়েড আপনার চিত্রটিকে চিত্রের সাথে মানিয়ে নেবে, অনুপাতের অনুপাত বজায় রাখবে। যাইহোক, নিশ্চিত করুন যে আপনি ImageView ছবিতে সেটিং করছি ব্যবহার করা android:src="..."বরং android:background="..."src=এটি চিত্রের অনুপাত বজায় রাখার চিত্রকে স্কেল করে তোলে তবে এটি চিত্রের আকারের সাথে একেবারে ফিট করার জন্য চিত্রটিকে background=স্কেল এবং বিকৃত করে তোলে । (আপনি একই সাথে একটি ব্যাকগ্রাউন্ড এবং উত্স ব্যবহার করতে পারেন, যা মূল চিত্রের চারপাশে একটি ফ্রেম প্রদর্শন করা, কেবল একটি চিত্র চিত্র দেখানোর মতো জিনিসগুলির জন্য কার্যকর হতে পারে))

  2. android:adjustViewBoundsপুনরুদ্ধারকৃত চিত্রের সাথে নিজেকে ফিরিয়ে আনার জন্য চিত্রভিউকে নিজের আকার পরিবর্তন করতেও দেখতে হবে। উদাহরণস্বরূপ, আপনার যদি সাধারণত একটি বর্গক্ষেত্রের চিত্র ভিউতে একটি আয়তক্ষেত্রাকার চিত্র থাকে তবে অ্যাডজাস্টভিউবাউন্ডস = সত্য এটি চিত্রের দৃশ্যকেও আয়তক্ষেত্রাকার হিসাবে আকার পরিবর্তন করবে। এটি তখন প্রভাব ফেলে যা কীভাবে অন্যান্য চিত্রের চিত্রের চারপাশে ছড়িয়ে দেওয়া হয়।

    তারপরে সামু লিখেছেন, android:scaleTypeপ্যারামিটারটি ব্যবহার করে আপনি এটি চিত্রের স্কেল স্কেল করার উপায়টি পরিবর্তন করতে পারেন । যাইহোক, এই কাজগুলি কীভাবে আবিষ্কার করা যায় তার সবচেয়ে সহজ উপায় হ'ল নিজেকে কিছুটা পরীক্ষা-নিরীক্ষা করা হত! শুধু মনে রাখবেন এমুলেটর নিজেই (বা একটি আসল ফোন) লেআউটগুলি দেখার জন্য যেমন Eclipse এ পূর্বরূপটি সাধারণত ভুল হয়।


18
এটি একই জিনিস, এক্সএমএল এর পরিবর্তে কোডে সম্পন্ন হয়েছে। setImageBitmapহিসাবে একই android:src="..."এবং setBackground...হয়android:background="..."
স্টিভ Haley হয়

4
@SuperUser image.setImageDrawable(...)হয় android:src="..."XML aswell হবে।
পিওরস্পাইডার

11
"অ্যান্ড্রয়েড: অ্যাডজাস্টভিউবাউন্ডস" এখানে নোট করার মতো সহজ কাজ! আপনি যদি এটি যুক্ত না করেন তবে আপনার সম্ভবত ইম্মভিউ বর্ডার / সীমানা / ধারকটি সঠিকভাবে স্কেলিং না করায় সমস্যা হবে।
ক্রুদ্ধ 84

2
src = বনাম ব্যাকগ্রাউন্ড = আমার জন্য পার্থক্য ছিল!
ক্রিস্টোফার রাথজেব

21
android:adjustViewBoundsআমার ধাঁধা শেষ টুকরা ছিল, ধন্যবাদ!
থিমারকেটকা

281

দেখুন android:adjustViewBounds

এটি যদি সত্যায়িত হয় তবে আপনি যদি চিত্রকল্পটি এর আঁকার দিকের অনুপাতটি সংরক্ষণ করার জন্য এর সীমানাকে সামঞ্জস্য করতে চান।


6
এটি এই সমস্যার সঠিক সমাধান the আমাদের ইমেজ ভিউতে আমরা এটি করছিলাম, যেখানে উচ্চতাতে এই সমস্ত অতিরিক্ত সাদা স্থানকে অন্তর্ভুক্ত করা হয়েছে। এটি "স্বচ্ছ পিক্সেল" নয়, যেহেতু আমাদের প্রস্থের জন্য পূর্ণ_পিতা এবং উচ্চতার জন্য মোড়ক_কন্টেন্ট ছিল। আপনার যদি অ্যাডজাস্টভিউবাউন্ডস = সত্য না থাকে তবে আপনি অতিরিক্ত হোয়াইটস্পেস পাবেন। এটি সত্যে সেট করার পরে, আমাদের সমস্যাটি চলে গেল। ধন্যবাদ!
ক্রিস্টোফেরকটন

3
ধন্যবাদ, এটি এবং ব্যাকগ্রাউন্ডের পরিবর্তে এটি এসআরসি-তে সেট করা পুরোপুরি কার্যকর হয়েছিল!
ক্যামেরন


1
এটি ইস্যুটির জন্য সঠিক সমাধান। আকারগুলির জন্য, আকার নির্ধারণ করতে প্যারেন্ট পাত্রে ব্যবহার করুন এবং চিত্র_ভিউতে ম্যাচ_পিতা সেট করুন। এটি অনেক সমস্যার সমাধান করে।
নিমিলা হিরণ্য

বিন্দুতে পেতে +1। আমি প্রথমে লিখেছিলাম যে আরও একটি "কথাবার্তা" বাক্যে এবং সফট আমাকে তা জমা দিতে বাধা দেয়। রাফাল পালকের পরিবর্তে একটি পিসি যান।
জ্যাকসনকর

168

অন্য যে কেউ এই বিশেষ সমস্যা আছে। আপনি একটি আছে ImageViewযে আপনি একটি প্রস্থ করতে চান fill_parentএবং উচ্চতা আনুপাতিক ছোটো:

আপনার এই দুটি বৈশিষ্ট্য যুক্ত করুন ImageView:

android:adjustViewBounds="true"
android:scaleType="centerCrop"

এবং ImageViewপ্রস্থটি fill_parentএবং উচ্চতাকে সেট করুনwrap_content

এছাড়াও, আপনি যদি নিজের চিত্রটি কাটা না চান তবে এটি চেষ্টা করুন:

 android:adjustViewBounds="true"
 android:layout_centerInParent="true"

16
হ্যাঁ তবে আপনার চিত্রটি ক্রপ হয়। নিখুঁত সমাধানটি প্রস্থে প্রসারিত হবে, অনুপাতের অনুপাত বজায় রাখবে এবং ফসলের নয়। এটি করার জন্য কেন এত আনন্দদায়ক হতে হবে তা আমার কোনও ধারণা নেই ...
ওয়ারপজিট

1
আমি হয় :( দুঃখিত যদি আমার সমাধানটি আপনাকে সহায়তা না করে তবে এটি আমাকে সহায়তা করেছিল
কেভিন পার্কার

2
কেভিন, আপনি যা বলেছিলেন তা হ'ল আমি যা খুঁজছিলাম তা যদি চিত্রটির আকার পর্দার চেয়ে কম হয় তবে এটি জুমযুক্ত এবং কেন্দ্রীভূত, নিখুঁত। ধন্যবাদ।
সোহম

1
"(বা অন্যান্য View)" বাদে +1 । এএএআইএফসিটির অন্য কোনও দর্শন adjustViewBoundsবা scaleTypeবৈশিষ্ট্য নেই।
লার্শ

অ্যান্ড্রয়েড: স্কেলটাইপ = "সেন্টারইনসাইড" অ্যান্ড্রয়েডের পরিবর্তে কীভাবে ব্যবহার করবেন: স্কেলটাইপ = "সেন্টারক্রপ"? এটি চিত্রটিও কাটবে না তবে এটি নিশ্চিত করবে যে প্রস্থ এবং উচ্চতা উভয়ই চিত্র দর্শনের প্রস্থ এবং উচ্চতার চেয়ে কম বা সমান হবে :) স্কেলটাইপগুলির জন্য এখানে একটি দুর্দান্ত ভিজ্যুয়াল গাইড রয়েছে: চিন্তাম্বল /
Vida

57

আপনি যদি ImageViewসঠিক দিক অনুপাত ধরে রাখার সময় উভয় স্কেল উপরে এবং নীচে আঁকতে চান তবে এটি আপনার এক্সএমএলে যুক্ত করুন:

android:adjustViewBounds="true"
android:scaleType="fitCenter"

এটি আপনার কোডে যুক্ত করুন:

// We need to adjust the height if the width of the bitmap is
// smaller than the view width, otherwise the image will be boxed.
final double viewWidthToBitmapWidthRatio = (double)image.getWidth() / (double)bitmap.getWidth();
image.getLayoutParams().height = (int) (bitmap.getHeight() * viewWidthToBitmapWidthRatio);

এই কাজটি পেতে আমার কিছুটা সময় লেগেছে, তবে চিত্রটি পর্দার প্রস্থের চেয়ে ছোট এবং পর্দার প্রস্থের চেয়ে বড় এবং উভয় ক্ষেত্রেই এটি কাজ করে বলে মনে হয়।


1
কেন শুধু অ্যান্ড্রয়েড ব্যবহার করবেন না: স্কেলটাইপ = "সেন্টারক্রপ"?
Lukas Batteau

ধন্যবাদ একটি মোহন মত কাজ করে। স্কেলটাইপ পরিস্থিতির উপর নির্ভর করে, উদাহরণস্বরূপ আমার ঠিক এটির দরকার ছিল।
ডেভিড

দৃশ্যটি পুনরায় আকার দেওয়ার এটি কিছুটা অসভ্য উপায়। আপনি চিত্রভিউতে বিটম্যাপ সেট করার পরে যদি ভিউ সীমা পরিবর্তন হয়? এটি কেন onMeasure () এ করা উচিত, যা আপনি যদি চিত্রকল্পের একটি কাস্টম সাবক্লাস তৈরি করেন তবে তা প্রয়োগ করা যেতে পারে।
অ্যারন লরিনক্জ

1
আমার যা যা দরকার তা হ'ল ফিট সেন্টার এবং অ্যাডজাস্ট ভিউবাউন্ডস, আমার পক্ষে কমপক্ষে বাকি কোডটি অপ্রয়োজনীয় ছিল
কিংজারজিল

এটি আমার পক্ষে কাজ করে এবং কোনও কোড যুক্ত করার দরকার নেই। অ্যাডজেক্টভিউবাউন্ডগুলি ব্যতীত যদি চিত্রের প্রস্থটি চিত্রের ভিউ প্রস্থের চেয়ে ছোট ছিল, এটি স্কেলিং করছে না, সুতরাং উচ্চতাটি স্থানীয় উচ্চতায় থামছে এবং প্রস্থে কিছু ব্যান্ড উপস্থিত হয়েছিল।
ক্রিশ্তি বালু

15

এটি আমার পক্ষে কাজ করেছে:

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="39dip"
android:scaleType="centerCrop"
android:adjustViewBounds ="true"


9

কোডের নীচে স্কেল চিত্রের জন্য অনুপাতের হিসাবে কাজ করছে:

Bitmap bitmapImage = BitmapFactory.decodeFile("Your path");
int nh = (int) ( bitmapImage.getHeight() * (512.0 / bitmapImage.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(bitmapImage, 512, nh, true);
your_imageview.setImageBitmap(scaled);

8

কটাক্ষপাত ImageView.ScaleType নিয়ন্ত্রণ এবং বুঝতে পথ পুনরায় আকার দেওয়া একটি ইন ঘটে ImageView। যখন চিত্রটি পুনরায় আকার দেওয়া হয় (এর অনুপাতের অনুপাত বজায় রেখে) তখন সম্ভাবনা থাকে যে চিত্রটির উচ্চতা বা প্রস্থ হয় ImageViewএর মাত্রাগুলির চেয়ে ছোট হয় ।


6

দিক অনুপাত রাখতে ইমেজভিউতে এই বৈশিষ্ট্যগুলি ব্যবহার করুন:

android:adjustViewBounds="true"
android:scaleType="fitXY"

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    />

কেবল এই উত্তরটি আমাকে সহায়তা করেছিল। ধন্যবাদ!
দিমিত্রি

6

কনস্ট্রেন্টলয়েটের ভিতরে এটি আমার পক্ষে এভাবে কাজ করেছিল:

<ImageView
    android:id="@+id/myImg"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"/>

তারপরে কোডে, আমি অঙ্কনযোগ্যটিকে সেট করে রেখেছি:

ImageView imgView = findViewById(R.id.myImg);
imgView.setImageDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.image_to_show, null));

এটি চিত্রটিকে তার দিক অনুপাত অনুসারে সুন্দরভাবে ফিট করে এবং এটি কেন্দ্রে রাখে।


5

আমার স্ক্রিনের চেয়ে ছোট একটি চিত্র আছে। এটি আনুপাতিকভাবে সর্বাধিকের দিকে প্রসারিত করতে এবং সেই দৃষ্টিভঙ্গিতে কেন্দ্রে আমাকে নিম্নলিখিত কোডটি ব্যবহার করতে হয়েছিল:

<ImageView
    android:id="@+id/my_image"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_centerInParent="true"
    android:adjustViewBounds="true"
    android:layout_weight="1"
    android:scaleType="fitCenter" />

তবে মনে রাখবেন যে, যদি আপনার কোনও আপেক্ষিক বিন্যাস থাকে এবং কিছু ভিউ চিত্রবিউয়ের উপরে বা নীচে সেট করা থাকে তবে সেগুলি সম্ভবত চিত্র দ্বারা ওভারল্যাপ হয়ে যাবে।


4

যদি চিত্রের মান হ্রাস পায়: ব্যবহার করুন

android:adjustViewBounds="true"

পরিবর্তে

android:adjustViewBounds="true"
android:scaleType="fitXY"

3

আপনার যে কেউ চিত্রটি সঠিক স্কেলিং এবং কোনও ক্রপিং ব্যবহারের সাথে সঠিকভাবে চিত্রের দৃশ্যের সাথে ফিট করতে চান For

imageView.setScaleType(ScaleType.FIT_XY);

যেখানে ইমেজভিউ হল এমন চিত্র যা আপনার ইমেজভিউ উপস্থাপন করে


4
নাহ, এটি দিক রেশন পরিবর্তন করে। দস্তাবেজগুলি বলে: "এক্স এবং ওয়াইয়ে স্বতন্ত্রভাবে স্কেল করুন, যাতে এসসিআরটি ঠিক ডিস্টির সাথে মেলে This এটি এসসিআরের দিক অনুপাত পরিবর্তন করতে পারে।"
রোজ পেরোন

যাইহোক, এই FIT_XY চিত্রের প্রদর্শনের জন্য চিত্রের প্রস্থ / উচ্চতা পরিবর্তনের জন্য ব্যবহার করা যাবে না।
বে

3

আপনি পর্দার প্রস্থ গণনা করতে পারেন। এবং আপনি বিটম্যাপ স্কেল করতে পারেন।

 public static float getScreenWidth(Activity activity) {
        Display display = activity.getWindowManager().getDefaultDisplay();
        DisplayMetrics outMetrics = new DisplayMetrics();
        display.getMetrics(outMetrics);
        float pxWidth = outMetrics.widthPixels;
        return pxWidth;
    }

পর্দার প্রস্থ এবং স্ক্রীন প্রস্থের সাহায্যে চিত্রের উচ্চতা গণনা করুন।

float screenWidth=getScreenWidth(act)
  float newHeight = screenWidth;
  if (bitmap.getWidth() != 0 && bitmap.getHeight() != 0) {
     newHeight = (screenWidth * bitmap.getHeight()) / bitmap.getWidth();
  }

আপনি বিটম্যাপ স্কেল করতে পারেন পরে।

Bitmap scaledBitmap=Bitmap.createScaledBitmap(bitmap, (int) screenWidth, (int) newHeight, true);

3

এই প্রোগ্রামটিমেটিক্যালি করার সময়, সেটগুলিকে সঠিক ক্রমে কল করতে ভুলবেন না:

imageView.setAdjustViewBounds(true)
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP)

2

আপনি যদি চান যে আপনার চিত্রটি সর্বাধিক সম্ভব স্থান দখল করে তবে সর্বোত্তম বিকল্পটি হবে

android:layout_weight="1"
android:scaleType="fitCenter"

2

আপনার কোনও জাভা কোডের দরকার নেই। আপনার কেবলমাত্র:

<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />

প্রস্থ এবং উচ্চতার জন্য কীটি ম্যাচ প্যারেন্টে রয়েছে


1

android:layout_gravityইমেজভিউয়ের জন্য ব্যবহার করার চেষ্টা করুন :

android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_vertical|center_horizontal"
android:layout_weight="1"

উপরের উদাহরণটি আমার পক্ষে কাজ করেছিল।


1
অ্যান্ড্রয়েড: লেআউট_ ওয়েট = "1" হ'ল মূল।
নিমা

1

কনটেইনার মাত্রাটি বেস্টফিট করতে একটি বিটম্যাপ স্কেল করার জন্য আমার কাছে একটি অ্যালগরিদম রয়েছে, এর দিক অনুপাত বজায় রেখে। দয়া করে আমার সমাধানটি সন্ধান করুন এখানে সন্ধান করুন

আশা করি এটিকে কাউকে গলি দিয়ে নামাতে সাহায্য করবে!



0

cardviewরাউন্ডিংয়ের জন্য ব্যবহারের ক্ষেত্রে imageviewএবং android:layout_heightশিরোলেখের জন্য স্থির করার ক্ষেত্রে এটি আমার সাথে ইমেজ লোড করার জন্য কাজ করেGlide

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="220dp"
             xmlns:card_view="http://schemas.android.com/apk/res-auto"
             >

    <android.support.v7.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top"
            card_view:cardBackgroundColor="@color/colorPrimary"
            card_view:cardCornerRadius="10dp"
            card_view:cardElevation="10dp"
            card_view:cardPreventCornerOverlap="false"
            card_view:cardUseCompatPadding="true">

        <ImageView
                android:adjustViewBounds="true"
                android:maxHeight="220dp"
                android:id="@+id/iv_full"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"/>

    </android.support.v7.widget.CardView>
</FrameLayout>

0

আপনি এমন চিত্র স্কেল করতে পারেন যা আপনার চিত্রের আকারও হ্রাস করবে। এটির জন্য একটি লাইব্রেরি রয়েছে আপনি এটি ডাউনলোড এবং ব্যবহার করতে পারেন। https://github.com/niraj124124/Images-Files-scale-and-compress.git

কীভাবে ব্যবহার করবেন 1) কমপ্রেসর-ভি 1.0 আমদানি করুন। আপনার প্রকল্পের জার। 2) পরীক্ষার জন্য নীচের নমুনা কোড যুক্ত করুন। রেজাইজিমিটার রিসাইজ = ইমেজআরাইজার। বিল্ড (); resize.scale ("ইনপুটআইজেজপ্যাথ", "আউটপুটইম্যাজপথ", ইমেজউইথ, ইমেজহাইট); আপনার প্রয়োজনীয়তা অনুসারে আরও অনেকগুলি পদ্ধতি রয়েছে


0

আপনার চিত্রভিউ পাস করুন এবং স্ক্রিনের উচ্চতা এবং প্রস্থের উপর ভিত্তি করে আপনি এটি তৈরি করতে পারেন

    public void setScaleImage(EventAssetValueListenerView view){
        // Get the ImageView and its bitmap
        Drawable drawing = view.getDrawable();
        Bitmap bitmap = ((BitmapDrawable)drawing).getBitmap();
        // Get current dimensions
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        float xScale = ((float) 4) / width;
        float yScale = ((float) 4) / height;
        float scale = (xScale <= yScale) ? xScale : yScale;

        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);

        Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        BitmapDrawable result = new BitmapDrawable(scaledBitmap);
        width = scaledBitmap.getWidth();
        height = scaledBitmap.getHeight();

        view.setImageDrawable(result);

        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();
        params.width = width;
        params.height = height;
        view.setLayoutParams(params);
    }


0

দ্রুত উত্তর:

<ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleType="center"
        android:src="@drawable/yourImage"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.