2

疑問がわきました。BitmapAndroidからピクセルを取得するとき。その中に画像がロードされています。この画像はグレースケール画像です。a を作成しgetPixels()て値を確認すると、R != G != B の値が表示されます。

3枚のスライド(R、G、B)の値が同じならグレースケールかどうかは確認できると思いますが、できませんでした。確認する方法はありますか?

どうもありがとう!

4

3 に答える 3

2

最初に、これを達成する方法がいくつかあることを述べましょう。

(のようなもの)を使用して画像のサイズを取得すると思います

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 として保存されている場合、実際にはグレースケール画像ではありませんが、技術的には、画像を A​​RGB_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;

}

可能な最適化はありますが、主要なアルゴリズムを文書化しようとしています。

これがあなたを助けることを願っています:-)

于 2012-06-09T06:24:14.220 に答える
1

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));
    }
}

シフトとマスキングの部分にコメントしたことがわかります。

于 2016-12-20T09:01:19.023 に答える