今天准备更新Topcoder时候碰到一个图片转换的问题。Topcoder题目里面的图是黑底白字的,但是博客中一般是白底黑字的,本来是想使用photoshop来处理一下,但是很难的碰到这么一个简单的图片处理的问题,因此就尝试使用java的图片处理的类来自己处理了一下,效果觉得还不错。
中间也没有遇到什么大问题,主要是由于cut下来的原图是有损的jpg图,因此造成字体不是严格意义上的白色(RGB=FFFFFF),所以试了几个阈值后达到了比较好的效果。

转换后图:

中间也没有遇到什么大问题,主要是由于cut下来的原图是有损的jpg图,因此造成字体不是严格意义上的白色(RGB=FFFFFF),所以试了几个阈值后达到了比较好的效果。
- package image;
- import java.awt.image.BufferedImage;
- import java.io.File;
- import javax.imageio.ImageIO;
- /**
- * 图片转色程序,将一幅颜色不很规则的黑底白色的图转换成白底黑字的图
- * 主要尝试一下java的图片操作
- * */
- public class ImageTest {
- private int threshold = 190;
- private String outputFileName="c:/aaa.jpg";
- public ImageTest() {
- }
- public ImageTest(int threshold,String outputFileName) {
- this.threshold = threshold;
- this.outputFileName=outputFileName;
- }
- public void converseColor(String fileName) {
- try {
- BufferedImage bf = ImageIO.read(new File(fileName));
- for (int i = 0; i < bf.getHeight(); i++) {
- for (int k = 0; k < bf.getWidth(); k++) {
- String tmp = Integer.toHexString(bf.getRGB(k, i));
- tmp = tmp.substring(tmp.length() - 6);
- if (isWhite(tmp))
- bf.setRGB(k, i, Integer.parseInt("000000", 16));
- else
- bf.setRGB(k, i, Integer.parseInt("ffffff", 16));
- }
- }
- ImageIO.write(bf, "JPG", new File(outputFileName));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private boolean isWhite(String src) {
- int red = Integer.parseInt(src.substring(0, 2), 16);
- int green = Integer.parseInt(src.substring(2, 4), 16);
- int blue = Integer.parseInt(src.substring(4, 6), 16);
- if (red > threshold && green > threshold && blue > threshold)
- return true;
- return false;
- }
- public static void main(String[] args) {
- new ImageTest(150,"c:/aaa.jpg").converseColor("c:/part.JPG");
- }
- }
转换后图:
