2017-09-10 14 views
2

私はBitmapオブジェクトとしてメモリにロードされたビットマップイメージを持っています。私はこれをImageViewに読み込むことができますCanvasなどを使用して操作を行う。私は3つのチャネルのグレースケールのビットマップが必要私が使用しているアルゴリズム。 下の画像は、How to GeekのEric Z Goodnightに書かれた記事のものです。リンクは以下の通りです。Androidでビットマップの赤、緑、青のチャンネルを抽出する方法

https://www.howtogeek.com/howto/42393/rgb-cmyk-alpha-what-are-image-channels-and-what-do-they-mean/

enter image description hereは、各チャネルに各色領域に対応するグレースケール画像で見ることができるように明るいあります。どのようにして、アンドロイドのビットマップ画像から各チャンネルに対応するグレースケール画像を抽出できますか?これらの3つのチャンネルグレースケールをそれぞれ含む3つのビットマップオブジェクトが必要です。私はColorMatrixの飽和を0に設定することによってグレースケールを作成する方法を見つけました。しかし、それは1つのグレースケールで返します。グレースケール画像を得る方法はありますか3つのチャンネルに?

+0

それを詳しく教えてください。 ColorMatricesにはあまり経験がありません。どんな助けでも本当に感謝しています。 –

答えて

1

ビットマップ形式のピクセルは、そのピクセルのAlpha、Red、Green、Blueチャネルを表す4バイトの整数で表されます。特定のチャネルを抽出するには、適切な16進数の値を使用して、すべてのピクセルに対してビット単位のORを実行します。

たとえば、0xFFFF0000は、最大アルファ(FF)、マックスレッド(FF)、ゼログリーン、ゼロブルーを表します。したがって、ピクセルごとのビットごとのORは、緑と青のチャンネルが無視される結果になり、ゼロ(00)になります。

とにかく、コードはred channelを抽出するために、以下のようになります。

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF00FF00); 
    } 
} 

blue channel

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFFFF0000); 
    } 
} 

を結果的に、green channelをすることによって得ることができる

for (int x = 0; x < bitmap.getWidth(); x++) 
{ 
    for (int y = 0; y < bitmap.getHeight(); y++) 
    { 
     bitmap.setPixel(x, y, bitmap.getPixel(x, y) & 0xFF0000FF); 
    } 
} 

最後に、画像をグレースケールで表示するには画像ビューウィジェットにColorMatrixを使用することができます:

ColorMatrix matrix = new ColorMatrix(); 
    matrix.setSaturation(0); 

    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix); 
    imageView.setColorFilter(filter); 
+0

詳細な回答ありがとうございます。私はこれを試し、私の結果も掲載します。私はこのポストが他の多くの開発者に役立つことを願っています。 –

関連する問題