Android BitMapチャネルを編集します
-
14-10-2019 - |
質問
特定のビットマップのアルファチャネルにアクセスすることが可能です extractAlpha()
, 、しかし、私は実際にビットマップのアルファチャネルを設定する方法を見つけることができませんでした。
Androidを使用してビットマップにチャネルとして複数のグレースケール画像を組み立てるにはどうすればよいですか?
解決
別々のチャネルをArgb画像に再結合することは非常に可能です。グレースケールチャネルの画像と、必要なアルファチャネルの画像が必要です - これは いいえ 不透明なグレースケールの画像ですが、 アルファ あなたが欲しい。次に、aで各チャネルを描画します Paint
適切なものを使用します PorterDuffXfermode
空白の黒い充填ビットマップに。
// have your 3 channel grayscales and 1 alpha bitmap loaded by this point
Paint redPaint = new Paint();
redPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
redPaint.setShader(new BitmapShader(redChanImg, TileMode.CLAMP, TileMode.CLAMP));
redPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, Mode.DARKEN));
Paint greenPaint = new Paint();
greenPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
greenPaint.setShader(new BitmapShader(greenChanImg, TileMode.CLAMP, TileMode.CLAMP));
greenPaint.setColorFilter(new PorterDuffColorFilter(Color.GREEN, Mode.DARKEN));
Paint bluePaint = new Paint();
bluePaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
bluePaint.setShader(new BitmapShader(blueChanImg, TileMode.CLAMP, TileMode.CLAMP));
bluePaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, Mode.DARKEN));
Paint alphaPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
alphaPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
c.setBitmap(resultImage);
c.drawRect(0, 0, width, height, redPaint);
c.drawRect(0, 0, width, height, greenPaint);
c.drawRect(0, 0, width, height, bluePaint);
c.drawBitmap(alphaImg, 0, 0, alphaPaint);
//save off resultImage, display it, etc...
上記のコードと次の4つの画像(それぞれ赤、緑、青、アルファ):
次の結果が得られます。
ちょっとしたメモ:赤い楕円形は透明な背景の上の不透明で赤い楕円形です - 色はこれには関係ありませんが、アルファはします
他のヒント
ビットマップを操作することは、ピクセル(バイト)に直接アクセスするときに、非常に簡単なことです。 Androidでそれを行うには、この承認でそれを行うことができます
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] b = bos.toByteArray();
これで、好きな画像操作、トランスフォーメーション、または組み合わせを行うことができます。
これがあなたが探していたものであることを願っています。
キャンバスで試しましたか?以下はハックのように見えますが、おそらく機能するでしょう。私はそれを自分でテストしていません。
Bitmap bitmap;
int color = bitmap.getPixel(1, 123);
Rect rect = new Rect(1,123,2,124);
Canvas c = new Canvas(bitmap);
c.clipRect(rect);
c.drawARGB(50, Color.red(color), Color.green(color), Color.blue(color));
所属していません StackOverflow