使用JMagick重新取样图像

时间:2013-08-26 14:34:07

标签: java imagemagick jmagick

如何使用JMagick API执行以下操作:

重新取样图片

(ImageMagick Command)Convert -units pixelsperinch <input file> -resample 300x300`

API中的

我找不到与每像素更改dpi相关的任何内容。

展平图片图层:

(ImageMagick Command)Convert <inputfile withlayers> -layers merge <outputfile >

请建议。

1 个答案:

答案 0 :(得分:3)

  • 对于-resample-layers选项,似乎没有便捷方法

JMagick的API文档中唯一类似于这些选项的内容是类MagickImage中的方法sampleImage。但是,它仅以像素运行。确实有setUnits方法允许您更改图像文件标题中声明的单位。但那是关于它的。它不会修改图像本身。并且sampleImagesetUnits方法之间似乎没有关联。

有一些代码可以使用“手动”计算重新采样图像。以下代码段基于可用的here

MagickImage lightImg = new MagickImage (new ImageInfo (strOrigPath));

//Get the original resolution 
double origXRes = lightImg.getXResolution();
double origYRes = lightImg.getYResolution();

//Get present dimensions
int w = (int)lightImg.getDimension().getWidth();
int h = (int)lightImg.getDimension().getHeight();

//Calculate new dimensions
double new_w =  w / origXRes * newXRes;
double new_h =  h / origYRes * newYRes;

//Scale image 
lightImg =lightImg.scaleImage((int)new_w, (int)new_h);

//Update info on image file
lightImg.setFileName(strDestPath);
lightImg.setXResolution( newXRes);
lightImg.setYResolution(newYRes);

//Save image
lightImg.writeImage(new ImageInfo());
  • 可能的替代方案

我建议您尝试使用im4java。来自网站:

  

JMagick是ImageMagick C-API上方的瘦JNI层。 im4java in   对比度只是为ImageMagick命令生成命令行   并将生成的行传递给选定的IM命令(使用   java.lang.ProcessBuilder.start() - 方法)。

因此,无论ImageMagick有什么命令选项,im4java都应该有一个方法。我已快速浏览了API,确实有resamplelayers方法。使用它们,您的代码看起来像这样(基于here的示例):

// create command
convertCmd cmd = new ConvertCmd();

// create the operation, add images and operators/options
IMOperation op = new IMOperation();
op.units("pixelsperinch");
op.addImage(strOrigPath);
op.resample(300, 300);

// execute the operation
cmd.run(op);

希望这有帮助!