如何调整位图在Android的最佳方法是什么?(How to resize Bitmaps the

2019-08-03 14:35发布

假设我有一个六边形:

如果我调整这个用它在我的应用程序,它包含六边形网格:

// ...
bgPaint = new Paint();
bgPaint.setAntiAlias(true);
bgPaint.setDither(true);

// ...
Bitmap coloredBackground = BitmapFactory.decodeResource(getResources(), R.drawable.bg);

// ...
canvas.drawBitmap(coloredBackground, null, getAsRect(), bgPaint);

我得到这个:

getAsRect()返回一个Rect我使用的图形对象。 我想实现的是在边缘摆脱那些透明像素。 我觉得我做错了什么,但我找不到地方为止。 你有什么想法,我怎么能解决这个问题?

我试着用抖动和抗混叠,但没有改变的实验。

Answer 1:

3点建议:

1

试试这个:关闭系统的缩放时通过设置解码资源BitmapFactory.Options.inScaled为false:

Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap source = BitmapFactory.decodeResource(context.getResources(), R.drawable.bg, options);

inScaled如果你需要的位图的非缩放版本标志应被关闭。

于是受你的位图Bitmap.createScaledBitmap(...)

2

另一个可能的原因是,你的瓷砖的对角线黑线包含不同的灰度:

这是你的瓷砖的特写:

这是抗锯齿它调整之前。 任何像素不是全黑可显示为在调整线颜色较浅。 你可以改变你的线线是完全黑色(0xFF000000),只有调整大小后做了抗混叠。

3

这个问题的另一个解决方案是设计你的瓷砖,像这样:

这避免了绘图彼此相邻两个反走样对角线的问题。



Answer 2:

你为什么不使用这一个呢?

Bitmap.createScaledBitmap(decodedBitmap, targetWidth, targetHeight, true);


Answer 3:

你可以尝试HQX大小调整算法:

或者,你可以画上一个更大的表面,并完全缩放在表面。



Answer 4:

我调整图像大小,如下所示:

    String url = ""; //replace with path to your image  
    int imageDimension = 48; // replace with required image dimension

    //decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(new FileInputStream(url), null, o);

    //Find the correct scale value. It should be the power of 2.
    final int REQUIRED_SIZE = imageDimension;
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;
    while(true){
        if(width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE)
            break;
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
    }

    //decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    Drawable drawable =  new BitmapDrawable(context.getResources(),    BitmapFactory.decodeStream(new FileInputStream(url), null, o2));


文章来源: How to resize Bitmaps the optimal way in Android?