我想知道如何以灰度显示彩色位图。必须分别为每个颜色空间组件完成。可能不是很清楚,所以我上传了图片来可视化它: 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/