0

Xiaolinアルゴリズムを適用してAndroidで画像の角を滑らかにする方法について質問していますピクセルを反復処理し、このピクセルを削除するか、画像の角を持たないようにするかを決定するアルゴリズムを作成しましたアルファ値の透明な255ですが、角が滑らかではなく、滑らかな線のXiaolinアルゴリズムについて読んでいますが、中級のJavaプログラマーであるため、このアルゴリズムを適用する方法がわかりません>>>誰か助けてくださいこのアルゴリズムを適用する方法、または別のアルゴリズムを提案する方法とその使用方法について私に説明します これは私のコードです

int radius = Integer.parseInt(((EditText)MainActivity.this.findViewById(R.id.editTextRadius)).getText().toString());
    int xCenter ;
    int yCenter;
    Bitmap mutableBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.h); 
    Bitmap drawaBitmap = mutableBitmap.copy(Bitmap.Config.ARGB_4444, true);


    for (int i = 0; i < radius; i++) {
        xCenter = radius;
        yCenter = radius;
        for (int j = 0; j < radius; j++) {
            if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

                    drawaBitmap.setPixel(i, j,
                            Color.argb(255, 255, 255, 255));
            }

        }
        xCenter = radius;
        yCenter =  drawaBitmap.getHeight()-radius;
        for (int j = drawaBitmap.getHeight()-1; j > drawaBitmap.getHeight()-radius; j--) {
            if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

                    drawaBitmap.setPixel(i, j,
                            Color.argb(255, 255, 255, 255));
            }

        }
    }
    for (int i = drawaBitmap.getWidth()-1; i > drawaBitmap.getWidth()-radius; i--) {
        xCenter = drawaBitmap.getWidth() - radius;
        yCenter =  radius;
        for (int j = 0; j < radius; j++) {
            if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2)) {

                    drawaBitmap.setPixel(i, j,
                            Color.argb(255, 255, 255, 255));
            }

        }
        xCenter = drawaBitmap.getWidth()-radius;
        yCenter =  drawaBitmap.getHeight()-radius;
        for (int j = drawaBitmap.getHeight()-1; j > drawaBitmap.getHeight()-radius; j--) {
            if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

                    drawaBitmap.setPixel(i, j,
                            Color.argb(255, 255, 255, 255));
            }

        }
    }
    ((ImageView)this.findViewById(R.id.image)).setImageBitmap(drawaBitmap);

前もって感謝します

4

2 に答える 2

1

だから、私はあなたのコードを試してみましたが、うまくいきました。私が提案した変更を追加しました。ImageView の xml は次のとおりです。

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layerType="hardware"/>

透明ピクセルではなく黒が表示される理由は、layerType が設定されていないことが原因である可能性があります。修正されたコード:

// hardcoded this value for testing purposes
int radius = 120;
int xCenter;
int yCenter;
Bitmap mutableBitmap = BitmapFactory.decodeResource(
                                  this.getResources(), R.drawable.h); 

// ARGB_8888 // ARGB_4444 has been deprecated
Bitmap drawaBitmap = mutableBitmap.copy(Bitmap.Config.ARGB_8888, true);

for (int i = 0; i < radius; i++) {
    xCenter = radius;
    yCenter = radius;

    for (int j = 0; j < radius; j++) {
    if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

            drawaBitmap.setPixel(i, j,
                            Color.argb(0, 0, 0, 0));
        }

    }

    xCenter = radius;
    yCenter =  drawaBitmap.getHeight()-radius;

    for (int j = drawaBitmap.getHeight()-1; j > drawaBitmap.getHeight()-radius; j--) {

        if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

            drawaBitmap.setPixel(i, j,
                            Color.argb(0, 0, 0, 0));
        }

    }
}
for (int i = drawaBitmap.getWidth()-1; i > drawaBitmap.getWidth()-radius; i--) {
    xCenter = drawaBitmap.getWidth() - radius;
    yCenter =  radius;

    for (int j = 0; j < radius; j++) {
        if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2)) {

        drawaBitmap.setPixel(i, j,
                            Color.argb(0, 0, 0, 0));
    }

}

xCenter = drawaBitmap.getWidth()-radius;
yCenter =  drawaBitmap.getHeight()-radius;

for (int j = drawaBitmap.getHeight()-1; j > drawaBitmap.getHeight()-radius; j--) {
    if (Math.pow(i - xCenter , 2) + Math.pow(j - yCenter , 2) > Math.pow(radius, 2) ) {

        drawaBitmap.setPixel(i, j,
                            Color.argb(0, 0, 0, 0));


    }

}

}

((ImageView) findViewById(R.id.image)).
    setBackgroundColor(getResources().getColor(android.R.color.transparent));

((ImageView) findViewById(R.id.imageView1)).setImageBitmap(drawaBitmap);

ちなみに、のColor.TRANSPARENT代わりにも使えますColor.argb(0, 0, 0, 0)

結果: オリジナル & 処理済み

ここに画像の説明を入力

于 2013-09-09T09:55:52.790 に答える
0

これは最初の基本的なものです:

int radius = 10;
Bitmap b = Bitmap.createBitmap(radius, radius, Config.ARGB_8888);
Bitmap mask = Bitmap.createBitmap(2 * radius, 2 * radius, Config.ARGB_8888);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas c;

// create mask
p.setColor(0xff000000);
c = new Canvas(mask);
c.drawCircle(radius, radius, radius, p);

// draw something on the original bitmap
// skip it if you have original bitmap drawn
c = new Canvas(b);
LinearGradient lg = new LinearGradient(0, 0, radius, radius, 0xffff0000, 0xff00ff00, TileMode.CLAMP);
p.setShader(lg);
c.drawRect(0, 0, radius, radius, p);
// end of skip

for (int x = 0; x < radius; x++) {
    for (int y = 0; y < radius; y++) {
        int maskPixel = mask.getPixel(x, y);
        if ((maskPixel & 0xff000000) != 0xff000000) {
            int bPixel = b.getPixel(x, y);
            bPixel &= 0xffffff;
            bPixel |= (maskPixel & 0xff000000);
            b.setPixel(x, y, bPixel);
        }
    }
}

try {
    OutputStream stream;
    stream = new FileOutputStream("/sdcard/image.png");
    b.compress(CompressFormat.PNG, 100, stream);
    stream = new FileOutputStream("/sdcard/mask.png");
    mask.compress(CompressFormat.PNG, 100, stream);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
于 2013-09-09T12:43:43.797 に答える