如何在Android中调整位图的最佳方式?

假设我有一个六边形:

六边形

如果我resize以在我的应用程序中使用它,其中包含六边形网格:

// ... 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对象。 我想要实现的是摆脱边缘的透明像素。 我想我做错了什么,但到目前为止我找不到。 你知道我怎么能解决这个问题?

我试着尝试抖动和抗锯齿,但没有改变。

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

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

这是你的瓷砖的特写:

在此处输入图像描述

它在重新resize之前是消除锯齿的。 任何不完全黑色的像素可能在resize的线条中显示为较浅的颜色。 您可以将线条线更改为完全黑色(0xFF000000)并仅在resize后执行消除锯齿。

3

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

在此处输入图像描述

这避免了彼此相邻地绘制两条抗锯齿对角线的问题。

为什么不使用这个呢?

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

您可以尝试使用hqxresize算法:

或者,您可以在更大的表面上绘画,并完全缩放该表面。

我正在调整图像大小如下:

  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));