从开始学习java开始,就没接触过awt编程
但是最近需要识别图片,需要把图片弄成白底黑字,但是网上有教程,加上没有对awt 好好了解过,锁,遇到一点麻烦
今天记录一下
图片的色素常用有16进制,还有rpg(255,255.255)
需要注意一点的事透明未0,黑色接近1,因为不知道这一点,所以问题弄一下午才出来,
我的代码
static String fromPic = "/home/if/ioi/1.png"; static String toPic = "/home/if/ioi/test.png"; static Set<Color> set = new HashSet<>(); public static void main(String[] args) throws IOException { File file = new File(fromPic); // 把图片读到 BufferedImage bufferedImage = ImageIO.read(new FileInputStream(file)); // 获得底片效果 // 获取像素 int[] rgbArr = new int[bufferedImage.getWidth() * bufferedImage.getHeight()]; // 参数依次是 从哪一个像素点开始获取 x y 获取多宽 多高 这个数组里面充满了像素点的值 从数组的哪一个角标开始 一行有多少 bufferedImage.getRGB(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), rgbArr, 0, bufferedImage.getWidth()); for (int i = 0; i < rgbArr.length; i++) { Color color = new Color(rgbArr[i]); // System.out.println(color); set.add(color); // 获取颜色的各个部分的值 int red = color.getRed(); if (red>100) { rgbArr[i] = Color.white.getRGB(); // rgbArr[i] = Color.BLACK.getRGB(); // rgbArr[i] =0xff000000; }else if (red>1){ rgbArr[i] = Color.black.getRGB(); } else { rgbArr[i] = Color.white.getRGB(); } // rgbArr[i] = ~rgbArr[i] | 0xff000000; } // for (int i = 0; i < rgbArr.length; i++) { // // Color color = new Color(rgbArr[i]); // set.add(color); // // 获取颜色的各个部分的值 // int red = color.getRed(); // // // rgbArr[i] = ~rgbArr[i] | 0xff000000; // // } bufferedImage.setRGB(0, 0, bufferedImage.getWidth(), bufferedImage.getHeight(), rgbArr, 0, bufferedImage.getWidth()); FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(new File(toPic)); ImageIO.write(bufferedImage, "png", fileImageOutputStream); fileImageOutputStream.flush(); fileImageOutputStream.close(); set.forEach(System.out::println); } }
参考原始代码(对不起这位博主来,找不到你的文章链接地址了)
public class Thumb {
// public static void main(String[] args) throws IOException {
static String fromPic = "/home/if/ioi/1.png";
static String toPic = "/home/if/ioi/test.png";
static Set<Color> set = new HashSet<>();
public static void main(String[] args) throws IOException {
File file = new File(fromPic);
// 把图片读到
BufferedImage bufferedImage = ImageIO.read(new FileInputStream(file));
// 获得底片效果
// 获取像素
int[] rgbArr = new int[bufferedImage.getWidth()
* bufferedImage.getHeight()];
// 参数依次是 从哪一个像素点开始获取 x y 获取多宽 多高 这个数组里面充满了像素点的值 从数组的哪一个角标开始 一行有多少
bufferedImage.getRGB(0, 0, bufferedImage.getWidth(),
bufferedImage.getHeight(), rgbArr, 0, bufferedImage.getWidth());
for (int i = 0; i < rgbArr.length; i++) {
// // 获取颜色
// Color color = new Color(rgbArr[i]);
// // 获取颜色的各个部分的值
// int red = 255 - color.getRed();
// int green = 255 - color.getGreen();
// int blue = 255 - color.getBlue();
// // 根据重新计算的像素值 创建的新的颜色 然后取出rgb设置回去
// rgbArr[i] = new Color(red, green, blue).getRGB();
// 一句话实现底片效果 为什么这样可以 解释每一个像素点都取反 同时透明度也取反
rgbArr[i] = ~rgbArr[i] | 0xff000000;
// 黑白效果
// 获取颜色
Color color = new Color(rgbArr[i]);
set.add(color);
// System.out.println(color);
// 获取颜色的各个部分的值
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();
int avg = (red + green + blue) / 3;
if (avg >50) {
rgbArr[i] = 0;
// } else {
// System.out.println("ok");
// rgbArr[i] = 0xffff;
}
}
bufferedImage.setRGB(0, 0, bufferedImage.getWidth(),
bufferedImage.getHeight(), rgbArr, 0, bufferedImage.getWidth());
FileImageOutputStream fileImageOutputStream = new FileImageOutputStream(new File(toPic));
ImageIO.write(bufferedImage, "jpg", fileImageOutputStream);
fileImageOutputStream.flush();
fileImageOutputStream.close();
// set.forEach(System.out::println);
}
}
对于图片更方便的操作
参考
http://www.cnblogs.com/fomeiherz/p/5882643.html
http://blog.csdn.net/wangpeng047/article/details/17610451
http://blog.csdn.net/w93223010/article/details/8265720\
eg:
// String toPic = "/home/if/ocr_test/dict.png";
//
// File file = new File(path);
//
// FileInputStream fileInputStream = new FileInputStream(file);
//
// Thumbnails.of(fileInputStream).scale(3.0).toFile(dict );
// Thumbnails.of(fromPic).scale(0.5).rotate(90).toFile(toPic);
// Thumbnails.of(fromPic).sourceRegion(Positions.CENTER,300,300)
// .size(300,300).toFile(toPic);
色素参考
http://www.sioe.cn/yingyong/yanse-rgb-16/