java - Android 编辑位图 channel

标签 java android bitmap paint color-channel

可以使用 extractAlpha() 访问给定位图的 alpha channel ,但我还没有找到任何方法来实际设置位图的 alpha channel 。

如何使用 Android 将多个灰度图像重新组合为位图的 channel ?

最佳答案

很有可能将单独的 channel 重新组合回 ARGB 图像。您只需要灰度 channel 图像和具有您想要的 alpha channel 的图像 - 请注意,这不是不透明的灰度图像,而是具有您想要的alpha 的图像。然后,您使用适当的 PorterDuffXfermode 使用 Paint 将每个 channel 绘制到空白的黑色填充位图上。

// have your 3 channel grayscales and 1 alpha bitmap loaded by this point

Paint redPaint = new Paint();
redPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
redPaint.setShader(new BitmapShader(redChanImg, TileMode.CLAMP, TileMode.CLAMP));
redPaint.setColorFilter(new PorterDuffColorFilter(Color.RED, Mode.DARKEN));

Paint greenPaint = new Paint();
greenPaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
greenPaint.setShader(new BitmapShader(greenChanImg, TileMode.CLAMP, TileMode.CLAMP));
greenPaint.setColorFilter(new PorterDuffColorFilter(Color.GREEN, Mode.DARKEN));

Paint bluePaint = new Paint();
bluePaint.setXfermode(new PorterDuffXfermode(Mode.LIGHTEN));
bluePaint.setShader(new BitmapShader(blueChanImg, TileMode.CLAMP, TileMode.CLAMP));
bluePaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, Mode.DARKEN));

Paint alphaPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
alphaPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));

c.setBitmap(resultImage);
c.drawRect(0, 0, width, height, redPaint);
c.drawRect(0, 0, width, height, greenPaint);
c.drawRect(0, 0, width, height, bluePaint);
c.drawBitmap(alphaImg, 0, 0, alphaPaint);

//save off resultImage, display it, etc...

使用上述代码和以下 4 张图像(分别为红色、绿色、蓝色和 alpha): alt text alt text alt text alt text

我们得到以下结果:


alt text


快速说明一下:红色椭圆是透明背景上的不透明红色椭圆 - 颜色对这个不重要,但 alpha 很重要

关于java - Android 编辑位图 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4560265/

相关文章:

java - 如何在 Java 服务器中验证 Twitter OAuth 凭据(包括电子邮件)

Android 数据绑定(bind) onLongClick 不工作

c# - 如何使用 ZeroMQ 监控机制检测网络故障?

java - 无法从 Android 上的 Firebase 数据库获取数据

android - 多个方向更改后,具有背景状态的 ImageView 崩溃

android - 在发送到 Wallpapermanager 之前调整位图大小

android - 在 onDestroy() 上从 View 中解除绑定(bind)可绘制对象

java - 在不求助于 DataType.SERIALIZABLE 的情况下在 ORMLite 中保留 Map<String,String>?

java - 如何在优先队列中设置优先级

java - 字符串输入(仅输出所说的第一个单词)