有时候项目中会对图片进行操作,像切图啦,二值化啦,灰度啦。。
在验证码识别的时候很有用
现在将java对图片操作的部分方法写下来
不管图片如何操作,关键是在new BufferImage 时候的 TYPE
BufferedImage.TYPE_BYTE_GRAY 是灰度化
BufferedImage.TYPE_BYTE_BINARY 是二值化
BufferedImage.TYPE_INT_ARGB ........
详细参数介绍如下:
(1) 将地址转换为BufferImage
public static BufferedImage console(String imgUrl) {
BufferedImage img = null;
try {
if (imgUrl.startsWith("http:")) {
img = ImageIO.read(new URL(imgUrl));
} else {
img = ImageIO.read(new File(imgUrl));
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
(2) 图片的灰度化:
public static void huiDuHua(BufferedImage img) {
int sWight = img.getWidth();
int sHight = img.getHeight();
BufferedImage newImage = new BufferedImage(sWight, sHight,
BufferedImage.TYPE_BYTE_GRAY);
for (int x = 0; x < sWight; x++) {
for (int y = 0; y < sHight; y++) {
int rgb= img.getRGB(x, y);
newImage.setRGB(x, y, rgb);
}
}
try {
ImageIO.write(newImage, "jpg", new File("aa.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
(3) 图片二值化
public static void erZhiHua(BufferedImage img) {
int sWight = img.getWidth();
int sHight = img.getHeight();
BufferedImage newImage = new BufferedImage(sWight, sHight,
BufferedImage.TYPE_BYTE_BINARY);
for (int x = 0; x < sWight; x++) {
for (int y = 0; y < sHight; y++) {
int rgb= img.getRGB(x, y);
newImage.setRGB(x, y, rgb);
}
}
try {
ImageIO.write(newImage, "jpg", new File("bb.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
(4)图片切割
public static BufferedImage cat(int x, int y, int wight, int hight,
BufferedImage img) {
int[] simgRgb = new int[wight * hight];
img.getRGB(x, y, wight, hight, simgRgb, 0, wight);
BufferedImage newImage = new BufferedImage(wight, hight,
BufferedImage.TYPE_INT_ARGB);
newImage.setRGB(0, 0, wight, hight, simgRgb, 0, wight);
// try {
// ImageIO.write(newImage, "PNG", new File("aa.png"));
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
return newImage;
}