转换PNG到PPM使用ImageIO十二猴子扩展



我需要将PNG文件转换为PPM文件。在同一个项目中,我使用了12vemonkey扩展将PPM转换为PNG,结果非常完美。但是当反过来尝试时,结果是错误的。

输出的PPM文件将始终具有高度=16和宽度=60,所以我还需要找出一种方法来缩小PNG而不会严重损失质量。

依赖性:

<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.9.3</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-pnm</artifactId>
<version>3.9.3</version>
</dependency>

代码:

public static File convertPngToPPM(File pngFile, String fileName) {
File ppmFile=new File(fileName.concat(".ppm"));
try {
BufferedImage inputImage=ImageIO.read(pngFile);

int imageHeight=inputImage.getHeight()==16 ? inputImage.getHeight() : 16;
int imageWidth=inputImage.getWidth() == 60 ? inputImage.getWidth() : 60;
BufferedImage resizedImage=resizeImage(inputImage, imageWidth, imageHeight);
ImageIO.write(resizedImage, "ppm", ppmFile);
} catch (Exception e){
log.error(e.getMessage());
log.error("Error reading the PPM file");
}
return null;
}
private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) {
Image resultingImage = originalImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH);
BufferedImage outputImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
outputImage.getGraphics().drawImage(resultingImage, 0, 0, null);
return outputImage;
}

错误:

2022-11-10 17:42:31.438 ERROR 17389 --- [  XNIO-1 task-1] com.mycompany.utilities.ImageUtilities   : Unsupported data type: 3

错误消息只是在上下文中打印异常消息,这并不是很有用。如果您打印完整的堆栈跟踪,您将看到它指向代码中的一个地方,上面写着:

// TODO: Support TYPE_INT through conversion, if number of channels is 3 or 4 (TYPE_INT_RGB, TYPE_INT_ARGB)

也就是说,当前不支持BufferedImage.TYPE_INT_RGB

这很容易修复,只需将图像转换为TYPE_3BYTE_BGR而不是TYPE_INT_RGB,您的代码就可以正常工作。InresizeImage:

BufferedImage outputImage = 
new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_3BYTE_BGR);

PS:抛出这个异常并不是PNM插件真正的好行为,因为它应该只是报告它不支持这个输入,ImageIO.write应该返回false。所以我认为这可以被归类为一个bug。

最新更新