Mala calidad de imagen después de cambiar el tamaño/escalar el mapa de bits

Resuelto Cbas asked hace 54 años • 11 respuestas

Estoy escribiendo un juego de cartas y necesito que mis cartas sean de diferentes tamaños en diferentes circunstancias. Estoy almacenando mis imágenes como mapas de bits para poder dibujarlas y volver a dibujarlas rápidamente (para animación).

Mi problema es que no importa cómo intente escalar mis imágenes (ya sea a través de una función Matrix.postScale, Matrix.preScale o createScaledBitmap), siempre salen pixeladas y borrosas. Sé que es la escala la que está causando el problema porque las imágenes se ven perfectas cuando se dibujan sin cambiar el tamaño.

He trabajado en todas las soluciones descritas en estos dos hilos:
calidad de Android de las imágenes redimensionadas en tiempo de ejecución
problemas de calidad al cambiar el tamaño de una imagen en tiempo de ejecución

pero todavía no he llegado a ninguna parte.

Guardo mis mapas de bits (en un mapa hash) con este código:

cardImages = new HashMap<Byte, Bitmap>();
cardImages.put(GameUtil.hearts_ace, BitmapFactory.decodeResource(r, R.drawable.hearts_ace));

y dibujarlos con este método (en una clase Card):

public void drawCard(Canvas c)
{
    //retrieve the cards image (if it doesn't already have one)
    if (image == null)
        image = Bitmap.createScaledBitmap(GameUtil.cardImages.get(ID), 
            (int)(GameUtil.standardCardSize.X*scale), (int)(GameUtil.standardCardSize.Y*scale), false);

        //this code (non-scaled) looks perfect
        //image = GameUtil.cardImages.get(ID);

    matrix.reset();
    matrix.setTranslate(position.X, position.Y);

    //These methods make it look worse
    //matrix.preScale(1.3f, 1.3f);
    //matrix.postScale(1.3f, 1.3f);

    //This code makes absolutely no difference
    Paint drawPaint = new Paint();
    drawPaint.setAntiAlias(false);
    drawPaint.setFilterBitmap(false);
    drawPaint.setDither(true);

    c.drawBitmap(image, matrix, drawPaint);
}

Cualquier idea sería muy apreciada. Gracias

Cbas avatar Jan 01 '70 08:01 Cbas
Aceptado

Utilice createScaledBitmap hará que su imagen se vea muy mal. Me encontré con este problema y lo resolví. El siguiente código solucionará el problema:

public Bitmap BITMAP_RESIZER(Bitmap bitmap,int newWidth,int newHeight) {    
    Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, Config.ARGB_8888);

    float ratioX = newWidth / (float) bitmap.getWidth();
    float ratioY = newHeight / (float) bitmap.getHeight();
    float middleX = newWidth / 2.0f;
    float middleY = newHeight / 2.0f;

    Matrix scaleMatrix = new Matrix();
    scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);

    Canvas canvas = new Canvas(scaledBitmap);
    canvas.setMatrix(scaleMatrix);
    canvas.drawBitmap(bitmap, middleX - bitmap.getWidth() / 2, middleY - bitmap.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));

    return scaledBitmap;

    }
le huynh avatar Sep 19 '2011 09:09 le huynh

Tenía imágenes borrosas en resoluciones de pantalla bajas hasta que desactivé el escalado en la carga de mapas de bits desde los recursos:

Options options = new BitmapFactory.Options();
    options.inScaled = false;
    Bitmap source = BitmapFactory.decodeResource(a.getResources(), path, options);
Lumis avatar Jan 27 '2011 21:01 Lumis

createScaledBitmaptiene una bandera donde puede establecer si la imagen escalada debe filtrarse o no. Esa bandera mejora la calidad del mapa de bits...

WarrenFaith avatar Jan 27 '2011 20:01 WarrenFaith

usar como

mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); 

Paint.FILTER_BITMAP_FLAGes trabajo para mi

chuckwu avatar Aug 07 '2012 07:08 chuckwu