24位色彩图
24位色彩图:每个像素通常使用四个字节存储,第一个字节为Alpha值,后三个字节为RGB。当R=G=B时,则色彩表示一种灰度颜色,其中R=G=B的值叫灰度值,范围0~255
几种灰度化的方法
分量法:使用RGB三个分量中的一个作为灰度图像的灰度值
最值法:使用RGB三个分量中最大值或最小值作为灰度图像的灰度值
均值法:使用RGB三个分量的平均值作为灰度图像的灰度值
加权法:灰度值Y=0.3*R+0.59*G+0.11*B
/*
* 使用加权法把24位色彩图转化为灰度图
*/
public static BufferedImage convertToGray(String imagePath)
{
BufferedImage bufferedImage = null;
try
{
bufferedImage = ImageIO.read(new File(imagePath));
}
catch(Exception e)
{
e.printStackTrace();
}
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
BufferedImage result = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
for(int j = 0;j < height;j++)
{
for(int i = 0;i < width;i++)
{
int argb = bufferedImage.getRGB(i, j);
int a = argb >> 24 & 0xFF;
int r = argb >> 16 & 0xFF;
int g = argb >> 8 & 0xFF;
int b = argb & 0xFF;
int gray = (int)(0.3 * r + 0.59 * g + 0.11 * b); //灰度值
int grayARGB = a << 24 | gray << 16 | gray << 8 | gray;
result.setRGB(i, j, grayARGB);
}
}
return result;
}
若设置为BufferedImage.TYPE_INT_RGB,则不用考虑Alpha值
/*
* 使用加权法把24位色彩图转化为灰度图
*/
public static BufferedImage convertToGray(String imagePath)
{
BufferedImage bufferedImage = null;
try
{
bufferedImage = ImageIO.read(new File(imagePath));
}
catch(Exception e)
{
e.printStackTrace();
}
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight();
BufferedImage result = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
for(int j = 0;j < height;j++)
{
for(int i = 0;i < width;i++)
{
int rgb = bufferedImage.getRGB(i, j);
int r = rgb >> 16 & 0xFF;
int g = rgb >> 8 & 0xFF;
int b = rgb & 0xFF;
int gray = (int)(0.3 * r + 0.59 * g + 0.11 * b); //灰度值
int grayRGB = 255 << 24 | gray << 16 | gray << 8 | gray;
result.setRGB(i, j, grayRGB);
}
}
return result;
}