tamaño studio imagen cambiar calidad bajar ajustar android android-imageview image-scaling

android - studio - Cómo escalar una imagen en ImageView para mantener la relación de aspecto



bajar calidad imagen android studio (22)

En Android, layout_width el layout_width ImageView como fill_parent (que ocupa todo el ancho del teléfono).

Si la imagen que coloco en ImageView es más grande que el layout_width , Android la escalará, ¿verdad? Pero ¿qué pasa con la altura? Cuando Android escala la imagen, ¿mantendrá la relación de aspecto?

Lo que descubro es que hay un espacio en blanco en la parte superior e inferior de ImageView cuando Android escala una imagen que es más grande que ImageView . ¿Es eso cierto? Si es así, ¿cómo puedo eliminar ese espacio en blanco?


  1. Sí, de forma predeterminada, Android reducirá su imagen para que se ajuste a ImageView, manteniendo la relación de aspecto. Sin embargo, asegúrese de que está configurando la imagen en ImageView con android:src="..." lugar de android:background="..." . src= hace escalar la imagen manteniendo la relación de aspecto, pero background= hace escalar y distorsionar la imagen para que se ajuste exactamente al tamaño de ImageView. (Sin embargo, puede usar un fondo y una fuente al mismo tiempo, lo que puede ser útil para cosas como mostrar un marco alrededor de la imagen principal, usando solo un ImageView).

  2. También debería ver android:adjustViewBounds para hacer que ImageView se redimensione a sí mismo para que se ajuste a la imagen reescalada. Por ejemplo, si tiene una imagen rectangular en lo que normalmente sería un ImageView cuadrado, adjustViewBounds = true hará que el tamaño de ImageView sea rectangular también. Esto afecta a la forma en que otras vistas se distribuyen alrededor de ImageView.

    Luego, como escribió Samuh, puedes cambiar la forma en que android:scaleType defecto las imágenes con el parámetro android:scaleType . Por cierto, ¡la forma más fácil de descubrir cómo funciona esto sería simplemente experimentar un poco tú mismo! Solo recuerde mirar los diseños en el propio emulador (o en un teléfono real) ya que la vista previa en Eclipse suele ser incorrecta.


A cualquier otra persona que tenga este problema en particular. Tiene un ImageView (u otra View ) que desea que tenga un ancho de fill_parent y una altura escalada proporcionalmente:

Agregue estos dos atributos a su ImageView :

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

Y establezca el ancho de ImageView en fill_parent y el alto en wrap_content .

Además, si no quieres que tu imagen sea recortada, prueba esto:

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


Al hacer esto mediante programación, asegúrese de llamar a los configuradores en el orden correcto:

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


Debajo del código Trabajando para la imagen de escala como relación de aspecto:

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);


Eche un vistazo a ImageView.ScaleType para controlar y comprender la forma en que se produce el cambio de tamaño en un ImageView . Cuando se cambia el tamaño de la imagen (mientras se mantiene su relación de aspecto), es probable que la altura o el ancho de la imagen sean más pequeños que las dimensiones de ImageView .


Esto funcionó para mí:

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


No necesitas ningún código Java. Sólo tienes que :

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

La clave está en el elemento principal para el ancho y la altura


Para cualquiera de ustedes que quiera que la imagen se ajuste exactamente a la vista de la imagen con una escala adecuada y sin uso de recorte

imageView.setScaleType(ScaleType.FIT_XY);

donde imageView es la vista que representa su ImageView


Puedes calcular el ancho de la pantalla. Y puedes escalar el mapa de bits.

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

calcular el ancho de la pantalla y la altura de la imagen escalada por el ancho de la pantalla.

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

Después se puede escalar el mapa de bits.

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


Si desea que su imagen ocupe el máximo espacio posible, la mejor opción sería

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


Si desea un ImageView que ImageView o disminuya la escala mientras mantiene la relación de aspecto adecuada, agregue esto a su XML:

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

Agregue esto a su código:

// 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);

Me tomó un tiempo hacer que esto funcionara, pero esto parece funcionar en los casos en que la imagen es más pequeña que el ancho de la pantalla y más grande que el ancho de la pantalla, y no encuadra la imagen.


Tengo un algoritmo para escalar un mapa de bits para ajustarse mejor a las dimensiones del contenedor, manteniendo su relación de aspecto. Por favor encuentre mi solución here

Espero que esto ayude a alguien por el camino!


Tengo una imagen más pequeña que la pantalla. Para estirarlo proporcionalmente al máximo y centrado en la vista, tuve que usar el siguiente código:

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

Sin embargo, tenga en cuenta que si tiene un diseño relativo y tiene algunos elementos configurados para estar por encima o por debajo de ImageView, lo más probable es que la imagen se superponga.


Trate de usar android:layout_gravity para ImageView:

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

El ejemplo anterior funcionó para mí.


Utilice estas propiedades en ImageView para mantener la relación de aspecto:

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


Ver android:adjustViewBounds .

Establézcalo en verdadero si desea que ImageView ajuste sus límites para preservar la relación de aspecto de su dibujo.


Yo uso esto:

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


en el caso de usar cardview para redondear imageview y android:layout_height fijo android:layout_height para encabezado, esto me android:layout_height para cargar imagen con 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>


esto resolvió mi problema

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


Pass your imageview and based on screen height and width you can make it 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); }


imageView.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 130, 110, false));


myImageView.setAdjustViewBounds(true);