Java 将图片转换为素描图
练习的时候突然想把自己几张照片处理为素描图,到网上查了一下没找到详细的Java实现代码。自己参考着http://sharehoo.cn/159058786244608.html这里的描述写了一下。
一、转换步骤
- 将RGB图转化为灰度图。
- 灰度图进行反色操作。
- 对步骤2中的图片进行高斯模糊。
- 将步骤1中的灰度图像和步骤三中的模糊反色图像混合。
二、准备
使用的是开源的JH Labs库:http://www.jhlabs.com/ip/filters/index.html,Java使用的时候需要下载图像处理类,地址为:http://www.jhlabs.com/ip/filters/download.html。
点击下载后解压,导入项目,将其打包成jar包,这样在别的项目里也可以很方便的使用它。我使用的是eclipse工具:
项目导入后:
导成jar包:
右键build.xml 选择Run As ,点击Ant build,成功之后的控制台:
生成的jar包:
到此为止,准备工作完成。
三、代码
1.在pom.xml里导入生成的jar包:
<dependency>
<groupId>pictureFilter.filter</groupId>
<artifactId>Filters</artifactId>
<version>0.0.1</version>
</dependency>
这里的groupId 和artifactId,version 根据自己的jar包的位置而定,我的jar包所在位置:
2.图片转换为素描图的核心代码:
package com.fanwei;
import java.awt.CompositeContext;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.jhlabs.composite.ColorDodgeComposite;
import com.jhlabs.image.GaussianFilter;
import com.jhlabs.image.GrayscaleFilter;
import com.jhlabs.image.ImageUtils;
import com.jhlabs.image.InvertFilter;
import com.jhlabs.image.PointFilter;
/**
* 图片处理为素描图
* @author 范伟带你打天下
*/
public class PictureTestDemo {
public static void main(String[] args) throws IOException {
BufferedImage src = null;
src=ImageIO.read(new File("D:\\test.jpg"));
src = ImageUtils.convertImageToARGB(src);
//图像灰度化
PointFilter grayScaleFilter = new GrayscaleFilter();
BufferedImage grayScale = new BufferedImage(src.getWidth(),src.getHeight(),src.getType());
grayScaleFilter.filter(src,grayScale);
//灰度图像反色
BufferedImage inverted = 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);
// 灰度图像和高斯模糊反向图混合
ColorDodgeComposite cdc = new ColorDodgeComposite(1.0f);
CompositeContext cc = cdc.createContext(inverted.getColorModel(),grayScale.getColorModel(),null);
WritableRaster invertedR = gaussianFiltered.getRaster();
WritableRaster grayScaleR = grayScale.getRaster();
BufferedImage Composite=new BufferedImage(src.getWidth(),src.getHeight(),src.getType());
WritableRaster colorDodgedR = Composite.getRaster();
cc.compose(invertedR,grayScaleR,colorDodgedR);
//输出做好的素描
File outputfile =new File("D:\\saved.png");
ImageIO.write(Composite,"png",outputfile);
}
}
效果展示:
大功告成!
总结
JH Labs这个开源库里还有很多有意思的滤镜,使用起来也很简单,快去试试吧!