가로 세로 비율을 유지하기 위해 ImageView에서 이미지 크기를 조정하는 방법


526

안드로이드에서, 나는 정의 ImageView의를 layout_widthfill_parent (휴대 전화의 전체 폭을 차지한다).

내가 넣은 이미지 ImageView가보다 큰 경우 layout_widthAndroid 에서 이미지 를 확장합니다. 그러나 높이는 어떻습니까? Android가 이미지의 크기를 조절할 때 종횡비가 유지됩니까?

내가 찾은 것은 ImageView안드로이드가 이미지보다 큰 이미지를 스케일 할 때 상단과 하단에 약간의 공백이 있다는 것입니다 ImageView. 그게 사실입니까? 그렇다면 어떻게 공백을 제거 할 수 있습니까?

답변:


799
  1. 예, 기본적으로 Android는 가로 세로 비율을 유지하면서 ImageView에 맞게 이미지를 축소합니다. 그러나를 사용 android:src="..."하지 않고 이미지를 ImageView로 설정했는지 확인하십시오 android:background="...". src=가로 세로 비율을 유지하면서 이미지의 크기를 조정하지만 ImageView의 크기에 정확히 맞게 이미지의 크기를 background=조정 하고 왜곡시킵니다. (하지만 배경과 소스를 동시에 사용할 수 있으므로 하나의 ImageView를 사용하여 기본 이미지 주위에 프레임을 표시하는 등의 작업에 유용 할 수 있습니다.)

  2. 또한 볼 것 android:adjustViewBounds 크기 조정 된 이미지에 맞게 ImageView의 크기를 조정해야합니다. 예를 들어 정사각형 ImageView가되는 사각형 이미지가있는 경우 adjustViewBounds = true를 사용하면 ImageView의 크기도 사각형이됩니다. 그런 다음 ImageView 주위에 다른 뷰가 배치되는 방식에 영향을줍니다.

    그런 다음 Samuh가 쓴 것처럼 android:scaleType매개 변수를 사용하여 기본적으로 이미지 크기를 조정하는 방식을 변경할 수 있습니다 . 그건 그렇고, 이것이 어떻게 작동하는지 발견하는 가장 쉬운 방법은 약간 직접 실험하는 것입니다! Eclipse의 미리보기가 일반적으로 잘못되기 때문에 에뮬레이터 자체 (또는 실제 전화)의 레이아웃을 살펴보십시오.


18
그것은 XML이 아닌 코드에서 수행 된 것과 같은 것입니다. setImageBitmap과 동일 android:src="..."하고 setBackground...있다android:background="..."
스티브 헤일리

4
@SuperUser image.setImageDrawable(...)android:src="..."xml에 있습니다.
PureSpider

11
"android : adjustViewBounds"는 여기서 주목할만한 편리한 도구입니다! 이것을 추가하지 않으면 ImageView 테두리 / 바운드 / 컨테이너가 올바르게 확장되지 않는 문제가 발생할 수 있습니다.
Angry 84

2
src = vs background =는 저의 차이였습니다!
Christopher Rathgeb

21
android:adjustViewBounds내 퍼즐의 마지막 조각이었습니다. 감사합니다!
themarketka

281

참조하십시오 android:adjustViewBounds.

ImageView가 드로어 블의 가로 세로 비율을 유지하기 위해 경계를 조정하도록하려면이 값을 true로 설정하십시오.


6
이것은 문제의 올바른 수정입니다. 높이에이 여분의 공백이 모두 포함 된 이미지보기에서이 기능을 사용했습니다. 너비가 fill_parent이고 높이가 wrap_content이므로 "투명 픽셀"이 아닙니다. adjustViewBounds = true가 없으면 추가 공백이 생깁니다. 그것을 true로 설정 한 후에, 우리의 문제는 사라졌습니다. 감사!
christophercotton

3
고마워, 이것과 배경 대신 src로 설정하면 완벽하게 작동했습니다!
카메론


1
이것은 문제에 대한 완벽한 수정입니다. 또한 크기의 경우 부모 컨테이너를 사용하여 크기를 설정하고 ImageView에서 match_parent를 설정하십시오. 이것은 많은 문제를 해결합니다.
Nimila Hiranya

포인트를 얻기 위해 +1 나는 처음에 좀 더 구어체 문구로 그것을 썼고 그것을 제출하는 것을 금지시켰다. 깃털을 주름 잡는 것이 아니라 PC로 갔다.
Jacksonkr

168

이 특정 문제가있는 다른 사람에게. 당신은이 ImageView당신의 폭을 가질 것인지를 fill_parent하고 높이가 비례 적으로 조정 :

이 두 가지 속성을 다음에 추가하십시오 ImageView.

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

그리고 설정 ImageViewfill_parent과 높이로wrap_content .

또한 이미지를 자르지 않으려면 다음을 시도하십시오.

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

16
예.하지만 이미지가 잘립니다. 완벽한 솔루션은 가로로 확장되고 가로 세로 비율을 유지하고 자르지 않습니다. 왜 이렇게해야할지 모르겠다.
Warpzit

1
나도 :( 나의 해결책이 도움이되지 않으면 죄송하지만 도움이되었습니다.
Kevin Parker

2
Kevin, 당신이 말한 것은 내가 찾던 것과 정확히 같았습니다. 이미지의 크기가 화면의 크기보다 작 으면 확대되고 중앙에 있으며 완벽합니다. 감사.
Soham

1
"(또는 기타 View)"를 제외하고 +1 AFAICT 다른 견해 adjustViewBounds또는 scaleType속성 이 없습니다 .
LarsH

android : scaleType = "centerCrop"대신 android : scaleType = "centerInside"를 사용하는 방법은 무엇입니까? 또한 이미지를 자르하지만, 폭과 높이를 모두 미만이다 또는 이미지 뷰의 폭과 높이를 동일 보장하지 않을 :) 여기 scaletypes을위한 좋은 시각적 인 가이드입니다 : thoughtbot.com/blog/android-imageview-scaletype-a-visual- 가이드
vida

57

당신이 원하는 경우 ImageView그 모두 스케일까지 적절한 화면 비율을 유지하면서, 당신의 XML이 추가 아래로 :

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
왜 android : scaleType = "centerCrop"을 사용하지 않습니까?
Lukas Batteau

매력처럼 작동합니다. scaleType은 상황에 따라 다릅니다. 예를 들어 정확히이 필요합니다.
David

이것은 뷰의 크기를 조정하는 약간 야만적 인 방법입니다. 비트 맵을 ImageView로 설정 한 후 뷰 경계가 변경되면 어떻게됩니까? 이것이 onMeasure ()에서 수행되어야하는 이유입니다. ImageView의 사용자 정의 서브 클래스를 만드는 경우 구현할 수 있습니다.
Aron Lorincz

1
내가 필요로하는 것은 fitCenter와 adjustViewBounds 뿐이었다. 적어도 나에게 필요한 나머지 코드는 불필요했다
kingargyle

이것은 나를 위해 작동하며 코드를 추가 할 필요가 없습니다. adjustViewBounds가 없으면 이미지 너비가 imageView 너비보다 작 으면 크기가 확대되지 않았으므로 높이가 기본 높이로 멈추고 일부 밴드가 나타나는 너비에 도달했습니다.
Cristi Băluță

15

이것은 나를 위해 일했다 :

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

10

이것은 내 문제를 해결했다

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

그것은 나를 위해 이미지의 종횡비를 유지하지 않습니다.
Dmitry

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

가로 세로 비율을 유지하려면 ImageView에서 다음 속성을 사용하십시오.

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

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

이 답변 만 도움이되었습니다. 감사!
Dmitry

6

이것이 ConstraintLayout 내에서 나를 위해 일한 방법입니다.

<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" />

그러나 상대 레이아웃이 있고 일부 요소가 ImageView 위 또는 아래로 설정되어 있으면 이미지와 겹칠 가능성이 높습니다.


4

이미지 품질이 저하되는 경우 : 사용

android:adjustViewBounds="true"

대신에

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

3

적절한 스케일링과 자르기 사용없이 이미지를 정확하게 이미지 뷰에 맞추고 싶은 사람

imageView.setScaleType(ScaleType.FIT_XY);

여기서 imageView는 ImageView를 나타내는보기입니다.


4
아니요, 종횡비가 변경됩니다. 문서에 따르면 : "X와 Y를 독립적으로 조정하여 src가 dst와 정확히 일치하도록합니다. 그러면 src의 종횡비가 변경 될 수 있습니다."
Rose Perrone

그런데이 FIT_XY를 사용하면 이미지 뷰에 표시 할 이미지의 너비 / 높이를 변경할 수 없습니다.
Bay

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_gravityImageView에 사용해보십시오 .

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

위의 예가 나를 위해 일했습니다.


1
android : layout_weight = "1"이 열쇠입니다.
nima

1

컨테이너 크기를 최적으로 맞추고 종횡비를 유지하면서 비트 맵을 스케일링하는 알고리즘이 있습니다. 내 솔루션을 여기에서 찾으 십시오

누군가가 차선을 내리는 데 도움이되기를 바랍니다!


0

나는 이것을 사용한다 :

<ImageView
android:id="@+id/logo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:src="@drawable/logo" />

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) 압축기 v1.0을 반입합니다. 프로젝트에 항아리. 2) 아래 샘플 코드를 추가하여 테스트하십시오. ResizeLimiter 크기 조정 = ImageResizer.build (); resize.scale ( "inputImagePath", "outputImagePath", imageWidth, imageHeight); 귀하의 요구 사항에 따라 더 많은 방법이 있습니다


0

ImageView를 전달하고 화면 높이와 너비를 기반으로 만들 수 있습니다

    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.