package image;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
public class Demo1 {
public static void main(String[] args) throws Exception {
//图片源文件
String imagePath = "G:\\desk.png";
BufferedImage bufferedImage = ImageIO.read(new FileInputStream(imagePath));
BufferedImage grayImage = getGrayImage(bufferedImage);
//输出目录+输出文件
File out = new File("G:\\TestImage\\wangGray2.png");
ImageIO.write(grayImage, "png",out);
}
/**
* 将图片置灰 --- 使用现成的类
* @param originalImage
* @return
*/
public static BufferedImage getGrayImage(BufferedImage originalImage){
BufferedImage grayImage;
int imageWidth = originalImage.getWidth();
int imageHeight = originalImage.getHeight();
//TYPE_3BYTE_BGR --> 表示一个具有 8 位 RGB 颜色分量的图像,对应于 Windows 风格的 BGR 颜色模型,具有用 3 字节存储的 Blue、Green 和 Red 三种颜色。
grayImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_3BYTE_BGR);
ColorConvertOp cco = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
cco.filter(originalImage, grayImage);
return grayImage;
}
/**
* 将图片置灰 --- 手动
* @param originalImage
* @return
*/
public static BufferedImage getGrayImageManual(BufferedImage originalImage){
int green = 0,red = 0,blue = 0,rgb;
int imageWidth = originalImage.getWidth();
int imageHight = originalImage.getHeight();
BufferedImage routeImage = new BufferedImage(imageWidth,imageHight,BufferedImage.TYPE_3BYTE_BGR);
for(int i = originalImage.getMinX();i < imageWidth;i++){
for(int j = originalImage.getMinY();j < imageHight;j++){
//获取该点像素,用Object类型标识
Object data = routeImage.getRaster().getDataElements(i, j,null);
red = routeImage.getColorModel().getRed(data);
green = routeImage.getColorModel().getGreen(data);
blue = routeImage.getColorModel().getBlue(data);
red = (red*3+green*6+blue*1)/10;
green = red;
blue = green;
rgb = (red*256 +green)*256 +blue;
if(rgb>8388608){
rgb = rgb - 256*256*256;
}
//将rgb值写回图片
routeImage.setRGB(i, j, rgb);
}
}
return routeImage;
}
}