programing

이미지를 이미지 보기에 맞추고 가로 세로 비율을 유지한 다음 이미지 보기 크기를 이미지 크기에 맞게 조정하시겠습니까?

newstyles 2023. 9. 1. 20:38

이미지를 이미지 보기에 맞추고 가로 세로 비율을 유지한 다음 이미지 보기 크기를 이미지 크기에 맞게 조정하시겠습니까?

를 의임크이적미합방에 ImageView?
다음과 같은 경우:

  • 처음에는ImageView*입니다. 250dp * 250dp 입니다.
  • 이미지의 더 큰 차원을 250dp로 스케일업/스케일다운해야 합니다.
  • 이미지가 가로 세로 비율을 유지해야 합니다.
  • ImageView 조정 후 조정된가 일치해야 합니다.

100및 예: 100*150 이의경우및미지이미지및▁e.ImageView166*250이어야 합니다.
150와 예: 150*100의 이미지입니다.ImageView250*$이어야 합니다.

경계를 다음과 같이 설정하면

<ImageView
    android:id="@+id/picture"
    android:layout_width="250dp"
    android:layout_height="250dp"
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="20dp"
    android:adjustViewBounds="true" />

가 이지가다니에 .ImageView 러나그나ImageView항상 250dp * 250dp입니다.

질문에 답은 제한된 답을 이 질 특 문 대 에 답 예 에 있 사 만 이 제 람 한 된 ImageView 크 서 이 는 답 찾 대 한 있 경 우 는 고 을 에 방 법 추 기 맞 로 저 와 를 은 지 미 정 같 지 한 도 : )).maxWidth) 과 같은 이 가장

    android:scaleType="centerInside"
    android:adjustViewBounds="true"

(원래 질문에 대한 설명 후 답변이 크게 수정되었습니다.)

후: 명후설:
작업은 xml로만 수행할 수 없습니다.영상과 영상의 스케일을 모두 조정할 수는 없습니다.ImageView이고 그서차그이 1원항상은고 250dp이,ImageView이미지와 동일한 치수를 가집니다.

이 코드는 축척됩니다. Drawable상당한ImageView250dp x 250dp와 같은 정사각형에 정확히 250dp의 1차원을 유지하고 가로 세로 비율을 유지합니다.에 그면러그.ImageView크기가 조정된 이미지의 치수에 맞게 조정됩니다.코드는 활동에 사용됩니다.버튼 클릭 핸들러를 통해 테스트했습니다.

맛있게 드세요 :)

private void scaleImage(ImageView view) throws NoSuchElementException  {
    // Get bitmap from the the ImageView.
    Bitmap bitmap = null;

    try {
        Drawable drawing = view.getDrawable();
        bitmap = ((BitmapDrawable) drawing).getBitmap();
    } catch (NullPointerException e) {
        throw new NoSuchElementException("No drawable on given view");
    } catch (ClassCastException e) {
        // Check bitmap is Ion drawable
        bitmap = Ion.with(view).getBitmap();
    }

    // Get current dimensions AND the desired bounding box
    int width = 0;

    try {
        width = bitmap.getWidth();
    } catch (NullPointerException e) {
        throw new NoSuchElementException("Can't find bitmap on given view/drawable");
    }

    int height = bitmap.getHeight();
    int bounding = dpToPx(250);
    Log.i("Test", "original width = " + Integer.toString(width));
    Log.i("Test", "original height = " + Integer.toString(height));
    Log.i("Test", "bounding = " + Integer.toString(bounding));

    // Determine how much to scale: the dimension requiring less scaling is
    // closer to the its side. This way the image always stays inside your
    // bounding box AND either x/y axis touches it.  
    float xScale = ((float) bounding) / width;
    float yScale = ((float) bounding) / height;
    float scale = (xScale <= yScale) ? xScale : yScale;
    Log.i("Test", "xScale = " + Float.toString(xScale));
    Log.i("Test", "yScale = " + Float.toString(yScale));
    Log.i("Test", "scale = " + Float.toString(scale));

    // Create a matrix for the scaling and add the scaling data
    Matrix matrix = new Matrix();
    matrix.postScale(scale, scale);

    // Create a new bitmap and convert it to a format understood by the ImageView 
    Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    width = scaledBitmap.getWidth(); // re-use
    height = scaledBitmap.getHeight(); // re-use
    BitmapDrawable result = new BitmapDrawable(scaledBitmap);
    Log.i("Test", "scaled width = " + Integer.toString(width));
    Log.i("Test", "scaled height = " + Integer.toString(height));

    // Apply the scaled bitmap
    view.setImageDrawable(result);

    // Now change ImageView's dimensions to match the scaled image
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams(); 
    params.width = width;
    params.height = height;
    view.setLayoutParams(params);

    Log.i("Test", "done");
}

private int dpToPx(int dp) {
    float density = getApplicationContext().getResources().getDisplayMetrics().density;
    return Math.round((float)dp * density);
}

ImageView:

<ImageView a:id="@+id/image_box"
    a:background="#ff0000"
    a:src="@drawable/star"
    a:layout_width="wrap_content"
    a:layout_height="wrap_content"
    a:layout_marginTop="20dp"
    a:layout_gravity="center_horizontal"/>


스케일링 코드에 대한 논의 덕분에:
http://www.anddev.org/.htmlhttp ://www.anddev.org/resize_and_rotate_image_-_example-t621.html


2012년 11월 7일:
되었습니다.

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

아래 코드는 동일한 크기의 이미지 보기로 완벽하게 비트맵을 만듭니다.비트맵 이미지의 높이와 너비를 가져온 다음 이미지 뷰의 매개 변수를 사용하여 새 높이와 너비를 계산합니다.따라서 필요한 이미지를 최상의 가로 세로 비율로 제공합니다.

int currentBitmapWidth = bitMap.getWidth();
int currentBitmapHeight = bitMap.getHeight();

int ivWidth = imageView.getWidth();
int ivHeight = imageView.getHeight();
int newWidth = ivWidth;

newHeight = (int) Math.floor((double) currentBitmapHeight *( (double) new_width / (double) currentBitmapWidth));

Bitmap newbitMap = Bitmap.createScaledBitmap(bitMap, newWidth, newHeight, true);

imageView.setImageBitmap(newbitMap)

즐거운 시간 되세요.

가해봅다니를 추가해 .android:scaleType="fitXY"의 신에게에.ImageView.

이 모든 작업은 XML을 사용하여 수행할 수 있습니다.다른 방법들은 꽤 복잡해 보입니다.어쨌든, 당신은 당신이 원하는 높이를 dp 단위로 설정한 다음, 내용물을 감싸거나 그 반대로 너비를 설정합니다.척도 사용fitCenter를 입력하여 이미지 크기를 조정합니다.

<ImageView
    android:layout_height="200dp"
    android:layout_width="wrap_content"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true"
    android:src="@mipmap/ic_launcher"
    android:layout_below="@+id/title"
    android:layout_margin="5dip"
    android:id="@+id/imageView1">

대부분의 경우에 효과적인 최상의 솔루션입니다.

다음은 예입니다.

<ImageView android:id="@+id/avatar"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:scaleType="fitXY"/>

하루 동안 검색해 본 결과, 이것이 가장 쉬운 해결책이라고 생각합니다.

imageView.getLayoutParams().width = 250;
imageView.getLayoutParams().height = 250;
imageView.setAdjustViewBounds(true);

편집된 Jarno Argillanders는 다음과 같이 대답합니다.

너비와 높이로 이미지를 맞추는 방법:

ImageView 초기화 및 이미지 설정:

iv = (ImageView) findViewById(R.id.iv_image);
iv.setImageBitmap(image);

이제 크기 조정:

scaleImage(iv);

scaleImage방법: (예상 경계 값을 바꿀있습니다.)

private void scaleImage(ImageView view) {
    Drawable drawing = view.getDrawable();
    if (drawing == null) {
        return;
    }
    Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int xBounding = ((View) view.getParent()).getWidth();//EXPECTED WIDTH
    int yBounding = ((View) view.getParent()).getHeight();//EXPECTED HEIGHT

    float xScale = ((float) xBounding) / width;
    float yScale = ((float) yBounding) / height;

    Matrix matrix = new Matrix();
    matrix.postScale(xScale, yScale);

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

    view.setImageDrawable(result);

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

.xmlsyslog.xml:

<ImageView
    android:id="@+id/iv_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" />

만약 그것이 당신에게 효과가 없다면 안드로이드:배경을 안드로이드:src로 교체하세요.

안드로이드: src가 주요 트릭을 할 것입니다.

    <ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitCenter"
    android:src="@drawable/bg_hc" />

그것은 매력적으로 잘 작동합니다.

enter image description here

다음 코드 사용:

<ImageView android:id="@+id/avatar"
           android:layout_width="fill_parent"
           android:layout_height="match_parent"
           android:scaleType="fitXY" />

이것이 제 경우에 도움이 되었습니다.

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

ImageView(이미지 보기)와 비트맵이 필요했기 때문에 비트맵은 ImageView(이미지 보기) 크기로 조정되고 ImageView(이미지 보기) 크기는 조정된 비트맵:)와 동일합니다.

저는 어떻게 해야 할지 이 게시물을 훑어보다가 마침내 여기에 설명된 방식이 아닌 제가 원하는 것을 했습니다.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/acpt_frag_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/imageBackground"
android:orientation="vertical">

<ImageView
    android:id="@+id/acpt_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:adjustViewBounds="true"
    android:layout_margin="@dimen/document_editor_image_margin"
    android:background="@color/imageBackground"
    android:elevation="@dimen/document_image_elevation" />

그런 다음 CreateView 메서드에서

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_scanner_acpt, null);

    progress = view.findViewById(R.id.progress);

    imageView = view.findViewById(R.id.acpt_image);
    imageView.setImageBitmap( bitmap );

    imageView.getViewTreeObserver().addOnGlobalLayoutListener(()->
        layoutImageView()
    );

    return view;
}

그런 다음 layoutImageView() 코드를 누릅니다.

private void layoutImageView(){

    float[] matrixv = new float[ 9 ];

    imageView.getImageMatrix().getValues(matrixv);

    int w = (int) ( matrixv[Matrix.MSCALE_X] * bitmap.getWidth() );
    int h = (int) ( matrixv[Matrix.MSCALE_Y] * bitmap.getHeight() );

    imageView.setMaxHeight(h);
    imageView.setMaxWidth(w);

}

그 결과 이미지가 완벽하게 안에 들어맞고 가로 세로 비율이 유지되며 비트맵이 안에 있을 때 ImageView에서 여분의 픽셀이 남지 않습니다.

결과

wrap_content를 true로 설정하고 ViewBounds를 true로 조정한 다음 setMaxWidth 및 setMaxHight가 작동하는 것이 중요합니다. 이는 ImageView의 소스 코드에 기록되어 있습니다.

/*An optional argument to supply a maximum height for this view. Only valid if
 * {@link #setAdjustViewBounds(boolean)} has been set to true. To set an image to be a
 * maximum of 100 x 100 while preserving the original aspect ratio, do the following: 1) set
 * adjustViewBounds to true 2) set maxWidth and maxHeight to 100 3) set the height and width
 * layout params to WRAP_CONTENT. */

피카소와 함께 제약 레이아웃에서 이 작업을 수행해야 했기 때문에 위의 답변 중 일부를 조합하여 이 해결책을 생각해냈습니다(내가 로드하는 이미지의 가로 세로 비율을 이미 알고 있으므로 도움이 됩니다)

setContentView(...) 후 어딘가에서 활동 코드를 호출했습니다.

protected void setBoxshotBackgroundImage() {
    ImageView backgroundImageView = (ImageView) findViewById(R.id.background_image_view);

    if(backgroundImageView != null) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int width = displayMetrics.widthPixels;
        int height = (int) Math.round(width * ImageLoader.BOXART_HEIGHT_ASPECT_RATIO);

        // we adjust the height of this element, as the width is already pinned to the parent in xml
        backgroundImageView.getLayoutParams().height = height;

        // implement your Picasso loading code here
    } else {
        // fallback if no element in layout...
    }
}

내 XML에서

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteY="0dp"
tools:layout_editor_absoluteX="0dp">

    <ImageView
        android:id="@+id/background_image_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:scaleType="fitStart"
        app:srcCompat="@color/background"
        android:adjustViewBounds="true"
        tools:layout_editor_absoluteY="0dp"
        android:layout_marginTop="0dp"
        android:layout_marginBottom="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginLeft="0dp"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <!-- other elements of this layout here... -->

</android.support.constraint.ConstraintLayout>

Bottom_toBottomOf 특성에 제약 조건이 없습니다.ImageLoader는 이미지 로드 사용 방법 및 상수에 대한 자체 정적 클래스입니다.

저는 매우 간단한 해결책을 사용하고 있습니다.여기 내 코드:

imageView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.getLayoutParams().height = imageView.getLayoutParams().width;
imageView.setMinimumHeight(imageView.getLayoutParams().width);

내 사진은 그리드 보기에서 동적으로 추가됩니다.이러한 설정을 이미지 보기로 설정하면 사진이 1:1 비율로 자동으로 표시될 수 있습니다.

할 수 . 크기를 조정할 수 있습니다.ImageView또는 설정된 것보다 그리기 가능한 이미지의 크기를 조정할 수 있습니다.ImageView를 검색합니다. 와 높이를 합니다.ImageView원하방 호법출다니. 이 통화 비 500보다 크다고 .

//250 is the width you want after resize bitmap
Bitmat bmp = BitmapScaler.scaleToFitWidth(bitmap, 250) ;
ImageView image = (ImageView) findViewById(R.id.picture);
image.setImageBitmap(bmp);

이 클래스는 비트맵의 크기를 조정하는 데 사용됩니다.

public class BitmapScaler{
// Scale and maintain aspect ratio given a desired width
// BitmapScaler.scaleToFitWidth(bitmap, 100);
 public static Bitmap scaleToFitWidth(Bitmap b, int width)
  {
    float factor = width / (float) b.getWidth();
    return Bitmap.createScaledBitmap(b, width, (int) (b.getHeight() * factor), true);
  }


  // Scale and maintain aspect ratio given a desired height
  // BitmapScaler.scaleToFitHeight(bitmap, 100);
  public static Bitmap scaleToFitHeight(Bitmap b, int height)
  {
    float factor = height / (float) b.getHeight();
    return Bitmap.createScaledBitmap(b, (int) (b.getWidth() * factor), height, true);
   }
 }

xml 코드는

<ImageView
android:id="@+id/picture"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:adjustViewBounds="true"
android:scaleType="fitcenter" />

빠른 답변:

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

그냥 xml로 쓰세요.

android:scaleType="centerCrop"

나를 위해 일했습니다.

저의 경우, 는 이 질문에 대한 댓글(@vida에 대한 크레딧)에 답이 묻혀 있는 것을 발견했습니다.

android:scaleType="centerInside"

를 사용하는 것은 어떻습니까?android:scaleType="centerInside"대신에android:scaleType="centerCrop"또한 이미지를 자르지는 않지만 너비와 높이가 모두 이미지 보기의 너비와 높이보다 작거나 같도록 보장합니다. :) 스케일 유형에 대한 좋은 시각적 가이드는 다음과 같습니다.Android ImageView ScaleType: 비주얼 가이드

저는 ConstraintLayout 내부의 ImageView를 사용하고 ImageView에서 adjustviewbound를 true로 설정합니다.

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:src="@drawable/myimg"
        android:adjustViewBounds="true"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

언급URL : https://stackoverflow.com/questions/8232608/fit-image-into-imageview-keep-aspect-ratio-and-then-resize-imageview-to-image-d