4

假设我有一个六边形:

六边形

如果我调整它的大小以在包含六边形网格的应用程序中使用它:

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

我尝试使用抖动和抗锯齿进行试验,但没有任何改变。

4

4 回答 4

7

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

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

在此处输入图像描述

这避免了在彼此旁边绘制两条抗锯齿对角线的问题。

于 2012-12-06T10:24:57.373 回答
1

为什么不改用这个呢?

Bitmap.createScaledBitmap(decodedBitmap, targetWidth, targetHeight, true);
于 2012-12-06T10:15:05.177 回答
1

您可以尝试使用hqx调整大小算法:

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

于 2012-12-06T10:31:41.197 回答
0

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

    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));
于 2012-12-06T10:05:22.177 回答