2

如何使用 JMagick API 在下面做:

重采样图像

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

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

展平图像层:

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

请建议。

4

1 回答 1

3
  • 似乎和选项都没有方便的方法。-resample-layers

JMagick 的 API 文档中唯一与这些选项相似的是sampleImageclass中的方法MagickImage。但是,这仅在像素中起作用。确实有一种setUnits方法可以让您更改图像文件头中声明的单位。但仅此而已。它不会修改图像本身。sampleImage和方法之间似乎没有联系setUnits

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

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 只是为 ImageMagick 命令生成命令行并将生成的行传递给选定的 IM 命令(使用 java.lang.ProcessBuilder.start() 方法)。

所以,无论 ImageMagick 有什么命令选项,im4java 都应该有一个方法。我快速浏览了 API,确实有一个resample和一个layers方法。使用它们,您的代码将如下所示(基于此处的示例):

// 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);

希望这可以帮助!

于 2013-11-09T22:35:07.947 回答