我需要将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。