0

Androidでビットマップを使用しています。グレースケールに変換しているので、各ピクセルの値は 0 から 255 の間であると予想されます。しかし、ピクセルについては、一部を 0 として取得し、その他を非常に大きな値として取得しています。どうしてか分かりません。[0,255] の範囲の値を取得できないのはなぜですか? どうすれば入手できますか?

私のコードは次のとおりです。

//Converting to grayscale
                        int width, height;
                        height = mybitmap.getHeight();
                        width = mybitmap.getWidth();    

                        Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                        Canvas c = new Canvas(bmpGrayscale);
                        Paint paint = new Paint();
                        ColorMatrix cm = new ColorMatrix();
                        cm.setSaturation(0);
                        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
                        paint.setColorFilter(f);
                        c.drawBitmap(mybitmap, 0, 0, paint);                
                        //Done bmpgrayscale is the grayscale image formed
                        Toast toast23=Toast.makeText(getApplicationContext(),"Grayscale made", Toast.LENGTH_LONG);  
                        toast23.show();
                        for (int i=0;i<210;i++){
                            for (int j=0;j<170;j++){

                                    Log.d("gray value is=", String.valueOf(bmpGrayscale.getPixel(i, j)));

                            }
                        }

出力の一部は次のとおりです。

12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 0
12-07 23:14:28.022: D/gray value is=(958): 83886079
12-07 23:14:28.022: D/gray value is=(958): 317846001
12-07 23:14:28.022: D/gray value is=(958): 602992880
12-07 23:14:28.022: D/gray value is=(958): 669772779
12-07 23:14:28.022: D/gray value is=(958): 904719596
12-07 23:14:28.022: D/gray value is=(958): 971894253
12-07 23:14:28.022: D/gray value is=(958): 1223552493
12-07 23:14:28.022: D/gray value is=(958): 1223552493
12-07 23:14:28.022: D/gray value is=(958): 1223552493
12-07 23:14:28.022: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493
12-07 23:14:28.052: D/gray value is=(958): 1223552493

助けてください。これを使用してビューをビットマップに変換し、続いてビットマップをグレースケールに変換しています。

編集

//Converting to grayscale
                        int width, height;
                        height = mybitmap.getHeight();
                        width = mybitmap.getWidth();    

                        Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                        Canvas c = new Canvas(bmpGrayscale);
                        Paint paint = new Paint();
                        ColorMatrix cm = new ColorMatrix();
                        cm.setSaturation(0);
                        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
                        paint.setColorFilter(f);
                        c.drawBitmap(mybitmap, 0, 0, paint);                
                        //Done bmpgrayscale is the grayscale image formed
                        Toast toast23=Toast.makeText(getApplicationContext(),"Grayscale made", Toast.LENGTH_LONG);  
                        toast23.show();
                        for (int i=0;i<210;i++){
                            for (int j=0;j<170;j++){
                                    int a=bmpGrayscale.getPixel(i, j);
                                    ByteBuffer b = ByteBuffer.allocate(4);
                                  //b.order(ByteOrder.BIG_ENDIAN); // optional, the initial order of a byte buffer is always BIG_ENDIAN.
                                    b.putInt(a  );

                                    byte[] result = b.array();                                      
                                    Log.d("gray value is=", String.valueOf((int)result[0]));

                            }
                        }
4

1 に答える 1

0

負の値を取得している理由がわかりません。オーバーフローの可能性がありますか? これが私がしたことです

int value = getLastBytes(1223552493); //Prints 237, the dec value of ED 

public int getLastBytes(long original) {
String hexBytes = Long.toHexString(original);
return Integer.parseInt(hexBytes.substring(hexBytes.length()-2),16);
}

あなたの場合、おそらく次のように呼び出すことができます:

Log.d("gray value is=", getLastBytes(bmpGrayscale.getPixel(i, j)));
于 2012-12-07T19:07:07.810 に答える