【问题标题】:Bitmaps - getting very large values位图 - 获得非常大的值
【发布时间】:2012-12-08 03:07:07
【问题描述】:

我在 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]));

                            }
                        }

【问题讨论】:

  • 我很困惑为什么您期望 0-255 的回报。如果您转换为十六进制,则较大的值更有意义:83886079 = 4FFFFFFF。 1223552493 = 48EDEDED。注意最后 3 组字节如何总是相等的? (灰度值总是 RGB 相等)
  • @TheCapn 好的。但我希望 [0,255] 范围内的值用于进一步操作。我该怎么办?如何将值转换为该范围?
  • 将int值转换为一系列字节,取最后8个字节再转换回int?您将得到 0-255 范围内的东西(0-FF 十六进制与 0-255 十进制相同)
  • @TheCapn 最后 8 个字节还是最后 8 位?你能给我一个代码吗?
  • 位对不起。我会整理一些代码并在几分钟内发布

标签: android bitmap grayscale


【解决方案1】:

不知道为什么你得到负值,可能是溢出的东西?这就是我所做的

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多