我需要将PNG文件转换为PPM文件。在同一个项目中,我使用了TwelveMonkey扩展将PPM转换为PNG,结果非常好。但是当尝试相反的方法时,它会导致错误。
输出PPM文件将始终具有height=16和Width=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发布于 2022-11-14 10:22:08
错误消息只是在上下文之外打印异常消息,这并不是很有用。如果您转而打印完整的堆栈跟踪,您将看到它指向代码中的一个位置,上面写着:
// 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,您的代码就可以正常工作。在resizeImage中
BufferedImage outputImage =
new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_3BYTE_BGR);PS:抛出这个异常并不是PNM插件真正的好行为,因为它应该报告它不支持这个输入,并且ImageIO.write应该返回false。所以我觉得这可以归类为窃听器。
https://stackoverflow.com/questions/74388981
复制相似问题