完美地放大小位图像素

时间:2017-09-16 01:08:23

标签: java android image bitmap filtering

我正在制作一款针对Android的像素游戏。我正在使用32x32图像。为了使游戏看起来相同,无论屏幕尺寸如何,我都动态地放大图像。我的问题是,在放大时,部分图像不会保持原始颜色:

6 tiles, just before the black edges there is an unwanted shadowy line (presumably the average of the black and the redish color)

6个瓷砖,最初为32x32。正如你所看到的,在黑色边缘之前有一条不需要的阴影线(大概是黑色和红色的平均值)。

这是我用于缩放的代码:

public abstract class Drawable {
    protected int x;
    protected int y;
    protected Bitmap image;

    Drawable(Bitmap image, int x, int y, float scale) {
        this.x = x;
        this.y = y;
        this.image =  Bitmap.createScaledBitmap(image, (int)(image.getWidth()*scale), (int)(image.getHeight()*scale), false);
    }

    abstract void draw(Canvas canvas);
}

正如您所看到的,我没有使用过滤器。这会使边缘区域更加模糊。是否有另一个过滤器,如果我在哪里使用true,在放大时实际上是否能够保持图像的清晰度?

编辑:

我现在尝试了这种方法:

 scaledRect = new RectF(x, y, x+image.getWidth()*scale, y+image.getHeight()*scale);
    paint = new Paint();
    paint.setAntiAlias(false);
    paint.setDither(false);
    paint.setFilterBitmap(false);

在平局电话中:

canvas.drawBitmap(this.image, null, scaledRect, paint);

没有成功......

1 个答案:

答案 0 :(得分:1)

Android默认使用双线性插值算法处理位图缩放。你要做的是最近邻插值。

制作一个Paint,关闭抖动和消除别名,不要通过createScaledBitmap绘制并试试这个:

paint.setDither(false);
paint.setAntiAlias(false);

canvas.drawBitmap(bitmap, null, new RectF(left, top, width, height), paint);