Mala calidad de imagen después de cambiar el tamaño/escalar el mapa de bits
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
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;
}
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);
createScaledBitmap
tiene una bandera donde puede establecer si la imagen escalada debe filtrarse o no. Esa bandera mejora la calidad del mapa de bits...
usar como
mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
Paint.FILTER_BITMAP_FLAG
es trabajo para mi