疑問がわきました。Bitmap
Androidからピクセルを取得するとき。その中に画像がロードされています。この画像はグレースケール画像です。a を作成しgetPixels()
て値を確認すると、R != G != B の値が表示されます。
3枚のスライド(R、G、B)の値が同じならグレースケールかどうかは確認できると思いますが、できませんでした。確認する方法はありますか?
どうもありがとう!
疑問がわきました。Bitmap
Androidからピクセルを取得するとき。その中に画像がロードされています。この画像はグレースケール画像です。a を作成しgetPixels()
て値を確認すると、R != G != B の値が表示されます。
3枚のスライド(R、G、B)の値が同じならグレースケールかどうかは確認できると思いますが、できませんでした。確認する方法はありますか?
どうもありがとう!
最初に、これを達成する方法がいくつかあることを述べましょう。
(のようなもの)を使用して画像のサイズを取得すると思います
int myHeight = myImage.getHeight();
int myWidth = myImage.getWidth();
この場合、3 つの異なる形式のいずれかである可能性があるため、ビットマップの構成も確認することをお勧めします。
ALPHA_8, ARGB_8888, or RGB_565
を使用して構成を取得します。
myImage.getConfig()
ルーティーン。これがどのように使用されるべきかについては、後で説明します。
イメージのサイズがわかったので、次のようにデュアル ループ構造を実行する必要があります。
boolean isGrayscaleImage = true; // assume it is grayscale until proven otherwise
for(int i = 0; i < myWidth; i++){
for(int j = 0; j < myHeight; j++){
int currPixel = myImage.getPixel(i, j);
if( false == isGrayScalePixel(currPixel) ){
isGrayscaleImage = false;
break;
}
}
}
ピクセルがグレースケールかどうかをテストする方法に戻る: 画像が ALPHA_8 として保存されている場合、実際にはグレースケール画像ではありませんが、技術的には、画像を ARGB_8888 画像に変換し、アルファ値を 0xFF に設定することでグレースケール画像に変換できます。 R、G、および B コンポーネントのそれぞれは、元の 8 ビット ALPHA_8 ベースのイメージ内で提供されるアルファ値に変換されます。
画像が RGB_565 形式の場合、シフトおよび MASKING 演算子を使用して R、G、および B の値を独自のバイトに引き離す必要があるため、これは少しトリッキーです。これが完了すると、基本的には ARGB_8888 画像 (以下で説明) を処理するのと同じようになります。
ARGB_8888 画像の場合: アルファ チャネルは常に 0xFF である必要があります。
質問で述べたように、R == G == B SO の場合、ピクセルはグレースケールと見なされます (サンプル コードは次のようになります)。
boolean isGrayScalePixel(int pixel){
int alpha = (pixel && 0xFF000000) >> 24;
int red = (pixel && 0x00FF0000) >> 16;
int green = (pixel && 0x0000FF00) >> 8;
int blue = (pixel && 0x000000FF);
if( 0 == alpha && red == green && green == blue ) return true;
else return false;
}
可能な最適化はありますが、主要なアルゴリズムを文書化しようとしています。
これがあなたを助けることを願っています:-)
R、G、および B の値が同じかどうかを確認するだけでよい場合はColors.red()
、 、Colors.green()
またはを使用してそれを行いColors.blue()
ます。
実際のコードの一部を次に示します。
for(int x=0;x< bmp.getWidth();x++) {
for(int y=0;y< bmp.getHeight();y++) {
int pixel=bmp.getPixel(x,y);
int alpha=Color.alpha(pixel);
int gray_color=Color.red(pixel);
int gray_color1=Color.green(pixel);
//int gray_color=pixel&0x000000ff;
//int gray_color1=(pixel&0x0000ff00)>>8;
//int gray_color2=(pixel&0x00ff0000)>>16;
//int gray_color3=Math.abs((pixel&0xff000000))>>24;
int pixels= (int)Math.pow(gray_color,gamma);
k.add(""+alpha+" "+gray_color+" "+gray_color1);
bmp.setPixel(x,y,Color.argb(alpha,pixels,pixels,pixels));
}
}
シフトとマスキングの部分にコメントしたことがわかります。