java - 仅以一种颜色空间分量值的灰度显示位图

标签 java android bitmap rgb grayscale

我想知道如何以灰度显示彩色位图。必须分别为每个颜色空间组件完成。可能不是很清楚,所以我上传了图片来可视化它: Grey-scale images visualisation 这些位图在颜色转换为一个颜色空间组件后显示:B、G、R、S(蓝色、绿色、红色、饱和度)。我想在 Android 中重复一遍。我试过这样的事情:

case 'blue': pixels[i]=Color.argb(alpha,0,0,blue);

但它根本不起作用。如何去除不需要的组件并以灰度显示具有一个颜色空间组件值的位图?

最佳答案

您将无法使用 ColorMatrixColorFilter 来显示饱和度,因为无法将公式转换为矩阵,并且对所有组件使用相同的技术可能比将其作为特殊情况处理更容易。

您包含的代码将生成一个蓝色位图,要以灰度显示蓝色分量,您还需要将其复制到红色和绿色 channel :

case 'blue': pixels[i]=Color.argb(alpha,blue,blue,blue);

同样适用于红色:

case 'red': pixels[i]=Color.argb(alpha,red,red,red);

和绿色:

case 'green': pixels[i]=Color.argb(alpha,green,green,green);

对于饱和度,您需要计算它。这是一个公式:

case 'saturation':         
     int rgbMax = red > green ? (red > blue ? red : blue) : (green > blue ? green : blue);
     if(rgbMax == 0)
     {
         pixels[i]=Color.argb(alpha,0,0,0);
     }
     else
     {
         int rgbMin = red < green ? (red < blue ? red : blue) : (green < blue ? green : blue);
         int saturation = (255 * (rgbMax - rgbMin)) / rgbMax;
         pixels[i]=Color.argb(alpha,saturation,saturation,saturation);
     }

如果您对结果不满意,请参阅 formula for HSV .

关于java - 仅以一种颜色空间分量值的灰度显示位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28158225/

相关文章:

java - 将 Double 从 Delphi/Pascal 转换为 Java

c# - 使用字节数组检查图像大小

android - 带有触摸事件的移动图像

java - 动态更改 GWT CellTable 的样式,以在视觉上将其标记为已禁用

java - 如何将 JScrollPane 与 JTextArea 一起使用?

java - 使用 Docker 进行 Spring 启动安全配置

java - 分数随 ActionMove 随机增加

android - 如何让编译器等待OnCompleteListener Kotlin

java - 另一个线程的代码如何在主线程上运行?

Android:如何从位图[25]中剪切位图[25]