2013-02-13 85 views
2

我正在使用im4java库进行ImageMagick的图像处理操作。如何使用im4java提高图像质量?

的代码我使用看起来像:

ImageCommand imageCommand = new ConvertCmd(); 
imageCommand.setSearchPath(getImageMagickPath()); 
operation = new IMOperation(); 
operation.quality(100d); 
operation.addImage(); 
operation.resize(getWidth()); 
operation.addImage(); 
imageCommand.run(operation, sourceImage, extention); 

但得到的图像质量差。使用命令行执行相同的操作可将质量提高4倍。使用im4java时是否应该设置其他设置?文件格式为jpg。在此先感谢...

回答

0

这是我使用的代码,它就像魅力

private static void saveScaleImage(File image, String outputImagePath, int width, Integer height, float quality, boolean fill) throws Exception { 
    Info info = new Info(image.getPath(), true); 
    String imageFormat = info.getImageFormat(); 
    IMOperation op = new IMOperation(); 
    op.addImage(imagen.getPath()); 
    int imageWidth = info.getImageWidth(), 
     imageHeight = info.getImageHeight(); 
    if (imageWidth> 0 && imageHeight > 0 && (imageFormat == null || !imageFormat.equalsIgnoreCase("TIFF"))) { 
     //fill transparencies && extra space with white 
     op.size(imageWidth, imageHeight); 
     op.addRawArgs("xc:white"); 
     op.addImage(outputImagePath); 
     // set up command 
     CompositeCmd composite = new CompositeCmd(); 
     composite.run(op); 
     op = new IMOperation(); 
     op.addImage(outputImagePath); 
    } 
    //add strip irrelevant info 
    op.strip(); 
    //resize 
    if (fill) { //crop image + fill 
     op.resize(width, height, "^").gravity("center").extent(width, height); 
    } else { //adjust 
     op.resize(width, height); 
    } 
    boolean smaller = imageWidth > 0 && imageHeight > 0 && imageWidth < width && imageHeight < width; 
    if (smaller) { 
     op.addImage(outputImagePath); 
     op.gravity("center"); 
    } 
    if (imageFormat == null || imageFormat.equalsIgnoreCase("PNG")) { 
     //jpeg teawks 
     op.type("optimize").quality((double) quality).blur(0d, .16); 
     //default to jpeg format 
     op.addImage("jpeg:" + outputImagePath); 
    } else { 
     op.addImage(outputImagePath); 
    } 
    // set up command 
    ConvertCmd convert = new ConvertCmd(); 
    //run command 
    convert.run(op); 
}