ImageIO.read()方法读取图片后重写,图片蒙上一层红色的解决办法(下)

在经过一系列探索,《ImageIO.read()方法读取图片后重写,图片蒙上一层红色的解决办法(上)》篇已经通过Jimi初步解决,但在Linux平台下必须开图形界面才行,但现实情况,服务器一般运行在init 3级别下,init 5不太现实,另外Jimi对象图片的处理也较差,部分图片重写后质量降低,模糊等,由此也证明了Java语言在处理图片上的劣势,这是非常让人纠心的事,最终只能借助于无敌的ImageMagick结合对应的JNI接口JMagick来完成,上篇《ImageMagick,Jmagick-linux_64安装说明》已经介绍了该软件在Linux下的安装过程,下面我们看看使用JMagick如何实现图片高质量重写。

import java.io.IOException;
import magick.ImageInfo;
import magick.MagickImage;
/**
 * Created on 2011-11-1
 *@author:[[email protected]]
 */
public class ImageTypeTest
{
	static {
		if (System.getProperty("jmagick.systemclassloader") == null) {
			System.setProperty("jmagick.systemclassloader", "no");
			System.err.println(System.getProperty("java.library.path"));
		}
		try {
			MagickImage.class.getClass();
		} catch (Error e) {
			System.err.println("Make sure JMagick libraries are available in java.library.path. Current value: ");
			System.err.println("java.library.path=" + System.getProperty("java.library.path"));
			throw e;
		}
	}

    /**
     * Created on 2011-11-1 
     * @throws IOException
     * @author:[[email protected]]
     */
    public final static void filterImageByScale(String srcFileName) throws IOException{
		MagickImage magic = null;
		try {
            ImageInfo imgInfo = new ImageInfo(srcFileName);
            magic = new MagickImage(imgInfo);
            int width = (int) magic.getDimension().getWidth();
            int height = (int) magic.getDimension().getHeight();
            MagickImage newImage = magic.scaleImage(width, height);
            newImage.profileImage("*", null); 
            newImage.setImageAttribute("JPEG-Sampling-factors", null); 
            newImage.setImageAttribute("comment", null); 
            newImage.setFileName("d:/img/bbb.jpg");
            newImage.writeImage(new ImageInfo());
            magic.destroyImages();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    public static void main(String[] args){
        String srcFileName = "d:/img/aaa.png";
        try{
            filterImageByScale(srcFileName);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

这样,彻底解决了图片跨平台处理的问题,而且服务器也不依赖于init 5级别运行。


你可能感兴趣的:(exception,linux,String,服务器,jni,null)