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

この問題に対する別の解決策は、次のようにタイルを設計することです。

ここに画像の説明を入力

これにより、アンチエイリアス処理された 2 つの対角線が隣り合って描画される問題が回避されます。

于 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 に答える