Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: redimensionamiento / ampliación de imagen de alta calidad

Necesito reducir las imágenes procedentes de un flujo de red sin perder calidad.

Estoy al tanto de esta solución Extraño problema de memoria al cargar una imagen en un objeto Bitmap, pero es demasiado grosero – inSampleSize es un entero y no permite un control más fino sobre las dimensiones resultantes. Es decir, necesito escalar imágenes a dimensiones específicas de h / w (y mantener la relación de aspecto).

  • ¿Hay alguna biblioteca o algoritmo para el calendario persa (Shamsi o Jalali) en Android?
  • No se puede escribir un algoritmo para filtrar elementos en un RecyclerView basado en un tiempo guardado con cada elemento
  • La similitud perceptual entre dos secuencias de audio
  • ¿Cómo se activa el "modo lector" en Firefox?
  • Android Compass orientación en poco fiable (filtro de paso bajo)
  • La mejor práctica para calcular la velocidad media de las coordenadas GPS
  • No me importa tener un algoritmo de bicubic / lancoz de DIY en mi código, pero no puedo encontrar ningún ejemplo que funcione en Android, ya que todos dependen de Java2D (JavaSE).

    EDIT: He adjunto una fuente rápida. El original es 720×402 captura de pantalla HD. Por favor, ignore las 2 miniaturas. La imagen grande superior se redimensiona automáticamente por android (como parte de la disposición) a aproximadamente 130×72. Es agradable y crujiente. La imagen inferior se cambia el tamaño con API y tiene artefactos graves

    texto alternativo

    También he intentado usar el BitmapFactory y, como dije antes, tiene dos problemas – ninguna manera de escalar al tamaño exacto y la imagen escalada es borrosa.

    ¿Ideas sobre cómo arreglar el artifcating?

    ¡Gracias!

      package qp.test; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.os.Bundle; import android.widget.ImageView; public class imgview extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Bitmap original = BitmapFactory.decodeResource(getResources(), R.drawable.a000001570402); Bitmap resized = getResizedBitmap(original, 130); //Bitmap resized = getResizedBitmap2(original, 0.3f); System.err.println(resized.getWidth() + "x" + resized.getHeight()); ImageView image = (ImageView) findViewById(R.id.ImageViewFullManual); image.setImageBitmap(resized); } private Bitmap getResizedBitmap(Bitmap bm, int newWidth) { int width = bm.getWidth(); int height = bm.getHeight(); float aspect = (float)width / height; float scaleWidth = newWidth; float scaleHeight = scaleWidth / aspect; // yeah! // create a matrix for the manipulation Matrix matrix = new Matrix(); // resize the bit map matrix.postScale(scaleWidth / width, scaleHeight / height); // recreate the new Bitmap Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); bm.recycle(); return resizedBitmap; } private Bitmap getResizedBitmap2(Bitmap bm, float scale) { /* float aspect = bm.getWidth() / bm.getHeight(); int scaleWidth = (int) (bm.getWidth() * scale); int scaleHeight = (int) (bm.getHeight() * scale); */ // original image is 720x402 and SampleSize=4 produces 180x102, which is // still too large BitmapFactory.Options bfo = new BitmapFactory.Options(); bfo.inSampleSize = 4; return BitmapFactory.decodeResource(getResources(), R.drawable.a000001570402, bfo); } } 

    Y el diseño

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="hullo" android:background="#00ff00" /> --> <ImageView android:id="@+id/ImageViewThumbAuto" android:layout_width="130dip" android:layout_height="72dip" android:src="@drawable/a000001570402" /> <ImageView android:id="@+id/ImageViewThumbManual" android:layout_width="130dip" android:layout_height="72dip" android:src="@drawable/a000001570402" android:layout_toRightOf="@id/ImageViewThumbAuto" /> <ImageView android:id="@+id/ImageViewFullAuto" android:layout_width="300dip" android:layout_height="169dip" android:scaleType="fitXY" android:src="@drawable/a000001570402" android:layout_below="@id/ImageViewThumbAuto" /> <ImageView android:id="@+id/ImageViewFullManual" android:layout_width="300dip" android:layout_height="169dip" android:scaleType="fitXY" android:src="@drawable/a000001570402" android:layout_below="@id/ImageViewFullAuto" /> </RelativeLayout> 

  • Extraer certificado crudo X.509 de un firmado APK o JAR
  • Subir contenido al hacer clic en el texto de edición
  • Relativelayout dentro Scrollview no funciona
  • SetRotation (90) para tomar la imagen en el modo vertical no funciona en los dispositivos samsung
  • Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
  • Adición de marcadores múltiples en Google Maps API v2 Android
  • 3 Solutions collect form web for “Android: redimensionamiento / ampliación de imagen de alta calidad”

    Puede utilizar BitmapFactory.Options con función (es) BitmapFactory.decode ,
    Usando inDensity y inTargetDensity

    Ejemplo: tiene un tamaño de imagen de 1600×1200 y desea cambiar el tamaño a 640×480
    Entonces 'inDensity'=5 y 'inTargetDensity'=2 (1600×2 igual a 640×5).

    Esperando esta ayuda.

    La imagen grande superior es simplemente reducida a 450px por el diseño, por lo que no hay artefactos.

    Los artefactos de la imagen grande inferior resultan de escalarla hasta 130px de ancho y luego de nuevo hasta aproximadamente 450px por el diseño. Así que los artefactos son hechos por su escala. Tratar

     Bitmap resized = getResizedBitmap(original, 450); 

    En su código y debe estar bien. Sin embargo, usted necesita adaptarse a la anchura real de la pantalla del teléfono tampoco.

    En pocas palabras, un buen algoritmo downscaling (no vecino más cercano como) consta de 2 pasos:

    1. Downscale usando BitmapFactory.Options :: inSampleSize-> BitmapFactory.decodeResource () tan cerca como sea posible de la resolución que usted necesita, pero no menos de lo que
    2. Llegar a la resolución exacta mediante la reducción de escala un poco utilizando Canvas :: drawBitmap ()

    Aquí está una explicación detallada de cómo SonyMobile resolvió esta tarea: http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

    Aquí está el código fuente de las utilidades de escala de SonyMobile: http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.