Android
PorterDuffモード
サーチ…
前書き
PorterDuffは、イメージが、互いに重ね合わされた「不規則な形の段ボール」であるかのようにイメージを結合する方法、およびオーバーラップする部分をブレンドするためのスキームとして記述されています
備考
「Porter Duff」自体は、 Thomas PorterとTom Duffの論文にちなんで名付けられたアルファ合成技術 です。
要約すると、この技術は、アルファチャネルを有する2つの画像を取り、2つの画像の画素値を組み合わせることによって出力画像を生成する。様々な合成モードは、異なる出力画像をもたらす。たとえば、次の画像では、青色の形状(光源、既存のピクセル)が異なるモードで黄色の形状(宛先、新しいピクセル)と組み合わされます。
PorterDuff ColorFilterの作成
PorterDuff.Mode
は、 PorterDuffColorFilter
を作成するために使用されます。カラーフィルタは、ビジュアルリソースの各ピクセルの色を変更します。
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
上記のフィルタは、不透明なピクセルを青色に着色します。
カラーフィルタはDrawable
適用することができます:
drawable.setColorFilter(filter);
それはImageView
適用することができます:
imageView.setColorFilter(filter);
また、 Paint
に適用すると、そのペイントを使用して描画される色がフィルタによって変更されます。
paint.setColorFilter(filter);
PorterDuff XferModeの作成
Xfermode
(「転送」モードと考える)は、描画パイプラインの転送ステップとして機能します。 Xfermode
Paint
に適用すると、 Paint
で描画されたピクセルは、モードごとに下にあるピクセル(既に描画されているピクセル)と結合されます。
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
今は青い色合いの塗料があります。描画されたシェイプは、シェイプの領域内に既に存在する透明でないピクセルを青く塗りつぶします。
PorterDuffXfermodeを使用して放射状のマスク(ビネット)をビットマップに適用する
/**
* Apply a radial mask (vignette, i.e. fading to black at the borders) to a bitmap
* @param imageToApplyMaskTo Bitmap to modify
*/
public static void radialMask(final Bitmap imageToApplyMaskTo) {
Canvas canvas = new Canvas(imageToApplyMaskTo);
final float centerX = imageToApplyMaskTo.getWidth() * 0.5f;
final float centerY = imageToApplyMaskTo.getHeight() * 0.5f;
final float radius = imageToApplyMaskTo.getHeight() * 0.7f;
RadialGradient gradient = new RadialGradient(centerX, centerY, radius,
0x00000000, 0xFF000000, android.graphics.Shader.TileMode.CLAMP);
Paint p = new Paint();
p.setShader(gradient);
p.setColor(0xFF000000);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
canvas.drawRect(0, 0, imageToApplyMaskTo.getWidth(), imageToApplyMaskTo.getHeight(), p);
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow