我正在创建一个应用程序,在该应用程序中,我想对图像进行转换以使其具有铅笔素描效果,可以通过photoshop轻松获得,如此处所述。
但是,我需要使代码中的整个过程自动化,并且肯定不应该在photoshop中“看”里面看看它是如何工作的(算法/转换等及其实现是什么)。
无论如何,从上面的文章中可以清楚地看到伪代码如下所示:
s =读取文件图像(“ / path / to / image”)
g =转换为灰度比例
i =反转-颜色(g)
b = Apply-Gaussian-Blur(i)
结果= Color-Dodge-Blend-Merge(b,g)
现在,只需找到提供我所需操作的开源图像处理库即可。通过谷歌搜索,我进入了JH Labs。他们免费提供了一个图像编辑器,我试图在该图像编辑器上复制上面提到的photoshop文章中所述的过程,实际上我得到了铅笔素描效果。现在,最好的部分是JH Labs图像编辑器背后的图像处理库是开源的。
然后,只需使用JH Labs库对伪代码进行编码即可,在这里...
BufferedImage src = null;
BufferedImage target = null;
src = ImageIO.read(新文件(“ C:\\ tmp \\ ss.png”));
src = ImageUtils.convertImageToARGB(src);
//转换开始=============
//灰度
PointFilter grayScaleFilter = new GrayscaleFilter();
BufferedImage grayScale = new BufferedImage(src.getWidth(),src.getHeight(),src.getType());
grayScaleFilter.filter(src,grayScale);
//反转灰度
BufferedImage reverse = new BufferedImage(src.getWidth(),src.getHeight(),src.getType());
PointFilter invertFilter = new InvertFilter();
invertFilter.filter(grayScale,inverted);
//高斯模糊器
GaussianFilter gaussianFilter = new GaussianFilter(20);
BufferedImage gaussianFiltered = new BufferedImage(src.getWidth(),src.getHeight(),src.getType());
gaussianFilter.filter(inverted,gaussianFiltered);
// color dodge
ColorDodgeComposite cdc = new ColorDodgeComposite(1.0f);
CompositeContext cc = cdc.createContext(inverted.getColorModel(),grayScale.getColorModel(),null);
栅格反转R = gaussianFiltered.getRaster();
栅格grayScaleR = grayScale.getRaster();
BufferedImage复合=新的BufferedImage(src.getWidth(),src.getHeight(),src.getType());
WritableRaster colorDodgedR = Composite.getRaster();
cc.compose(invertedR,grayScaleR,colorDodgedR);
// =================================
目标=复合;
文件outputfile =新File(“ C:\\ tmp \\ saved.png”);
ImageIO.write(target,“ png”,输出文件);
这是我应用上述代码时图像转换的方式... 注意:-我在png图像上使用了以上代码。JH Labs代码仅适用于TYPE_INT_ARGB(ref)图像,因此您可能需要正确转换它们。-上面显示的代码仅用于检查概念,并不考虑其性能和美观。致谢:好吧,老实说,从成为外星人到图像处理再到代码,并不是本文所描述的那样线性的过程,为此,我不得不做很多尝试。我要感谢杰瑞,他耐心地回答了我的问题。