java - 字节数组进入灰度。安卓拍照
问题描述
当我在 android 中制作照片时,我从相机收到一个字节数组。我想将此数组(图像)转换为 2 种颜色 - 白色和黑色。有任何想法吗?将相机模式更改为单声道/负片对我来说不是一个解决方案。
问候。
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.
推荐阅读
- laravel - 如何在 Laravel 中使用 Vuetify (VAutocomplete)
- python-3.x - 用户使用 python 将 pdf 转换为 jepg,在 docker 中引发 wand.exceptions.WandRuntimeError
- mysql - 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包
- ruby-on-rails - Rails 开发中的长重新加载时间
- java - 为什么 String 列表没有 forEach 方法?
- android - Flutter:为长文本的动态高度的 ButtonBar 中的两个按钮提供相等的宽度
- angular - Angular命名路由器出口抛出错误
- javascript - jQuery每个循环只给出第一个结果
- java - 无法分析我的 Maven 项目。我的 pom.xml 文件中有错误吗?
- .htaccess - .htaccess RewriteRule 中的阿拉伯语 ( م ) 字符问题