当我在android中拍照时,我会从相机收到一个字节数组。我想把这个数组(图像(转换成两种颜色——白色和黑色。有什么想法吗?将相机模式更改为单声道/负片对我来说不是一个解决方案。
问候。
EDIT1:代码在Java 中
首先,您需要从数组创建位图:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;
// data is your byte array
Bitmap bmpOriginal = BitmapFactory.decodeByteArray(data, 0, data.length, options);
Canvas canvas = new Canvas(bmpOriginal);
Bitmap bmpGrayscale = toGrayscale(bmpOriginal);
bmpOriginal.recycle(); // free memory immediately, as your bitmap is not garbage collected by now.
然后,您可以将彩色图像bmpOriginal
传递到转换方法
public Bitmap toGrayscale(Bitmap bmpOriginal) {
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.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(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
上面的代码将为您提供灰度位图。它简单地将零饱和度滤波器应用于图像。饱和度是一种颜色的纯度,纯度越低,色差就越小。使用以上滤镜后,你得到的唯一区别就是亮度。最亮的是白色,最暗的是黑色。如果你想把它转换回字节数组,你可以尝试这样的方法:
Bitmap bmpGrayscale = intent.getExtras().get("data");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmpGrayscale.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
bmpGrayscale.recycle(); // free memory immediately, as your bitmap is not garbage collected by now.