【发布时间】:2011-08-15 17:17:41
【问题描述】:
由于某种原因,使用 ImageBuffer 和 ImageIO 打开一些 PNG 文件不起作用。这是我正在使用的一些代码,可以很好地调整/裁剪 JPG 的大小:
BufferedImage image = ImageIO.read(new File(location));
BufferedImage croppedImage = image.getSubimage(
cropInfo.getX(), cropInfo.getY(), cropInfo.getW(), cropInfo.getH());
BufferedImage resizedImage = new BufferedImage(
TARGET_WIDTH, TARGET_HEIGHT, croppedImage.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(croppedImage, 0, 0, TARGET_WIDTH, TARGET_HEIGHT, null);
g.dispose();
this.changeContentType("image/png", ".png"); // not really relevant. just a property
ImageIO.write(resizedImage, "png", new File(location));
return resizedImage;
此函数的目标是采用给定的任何类型,调整大小并裁剪图像,然后将其保存为具有相同文件名的 PNG。
它适用于 Windows,但如果我在 Linux (lenny) 上裁剪/调整大小,它会完全崩溃并抱怨文件的类型(它说类型为 0)。
java.lang.IllegalArgumentException: Unknown image type 0
java.awt.image.BufferedImage.<init>(BufferedImage.java:490)
trainingdividend.domain.file.ServerImage.resizeImage(ServerImage.java:68)
trainingdividend.domain.file.ServerImage.cropAndResize(ServerImage.java:80)
trainingdividend.service.user.UserAccountManagerImpl.cropAvatar(UserAccountManagerImpl.java:155)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
解决方案?
还有其他库我可以完全使用吗?
【问题讨论】:
-
你在 Linux 中使用的是哪个 JVM? (编辑:根据堆栈跟踪中的
sun.reflect判断,这是 Sun 的,但可以肯定的是) -
是的,最新的sun jvm。 1.6_24
-
好吧,我修好了。如果 image.getType() == 0,我在其中放置了一个 hack,我手动将其设置为 5。这行得通。
-
FWIW,我刚刚在 windows (jvm 1.6.0_20) 上编译完你的代码,它在随机 jpg 上运行良好。我想知道它是否可能是您的输入文件。
-
不,此代码适用于所有 Windows。它只是在升级了 jdk 的 Debian (lenny) 上不起作用。我只是检查类型是否为 0,如果是,我传入 5。这似乎使它工作。我的猜测是这是一个错误,与我完全无关:(
标签: java image image-processing resize crop