除了使用ImageIO.read获取图像的高度和宽度之外,还有其他方法吗?
因为我遇到了一个锁定线程的问题。
at com.sun.medialib.codec.jpeg.Decoder.njpeg_decode(Native Method)
at com.sun.medialib.codec.jpeg.Decoder.decode(Decoder.java:87)
at com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader.decode(CLibJPEGImageReader.java:73)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.getImage(CLibImageReader.java:320)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at com.sun.media.imageioimpl.plugins.clib.CLibImageReader.read(CLibImageReader.java:384)
- locked <0xd96fb668> (a com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader)
at javax.imageio.ImageIO.read(ImageIO.java:1400)
at javax.imageio.ImageIO.read(ImageIO.java:1322)
此错误仅发生在Sun应用程序服务器上,因此我怀疑这是一个Sun bug。
发布于 2012-02-01 01:17:39
这里有一些非常简单和方便的东西。
BufferedImage bimg = ImageIO.read(new File(filename));
int width = bimg.getWidth();
int height = bimg.getHeight();
发布于 2012-08-29 00:57:34
这是@Kay对这篇很棒的文章的重写,它抛出了IOException,并提供了一个提前退出:
/**
* Gets image dimensions for given file
* @param imgFile image file
* @return dimensions of image
* @throws IOException if the file is not a known image
*/
public static Dimension getImageDimension(File imgFile) throws IOException {
int pos = imgFile.getName().lastIndexOf(".");
if (pos == -1)
throw new IOException("No extension for file: " + imgFile.getAbsolutePath());
String suffix = imgFile.getName().substring(pos + 1);
Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
while(iter.hasNext()) {
ImageReader reader = iter.next();
try {
ImageInputStream stream = new FileImageInputStream(imgFile);
reader.setInput(stream);
int width = reader.getWidth(reader.getMinIndex());
int height = reader.getHeight(reader.getMinIndex());
return new Dimension(width, height);
} catch (IOException e) {
log.warn("Error reading: " + imgFile.getAbsolutePath(), e);
} finally {
reader.dispose();
}
}
throw new IOException("Not a known image file: " + imgFile.getAbsolutePath());
}
我猜我的名气还不够高,不足以让我的意见被认为值得作为回复。
发布于 2013-02-15 12:08:38
我尝试使用列出的一些不同的方法来测试性能。由于影响结果的因素很多,很难进行严格的测试。我准备了两个文件夹,一个包含330个jpg文件,另一个包含330个png文件。两种情况下的平均文件大小都是4Mb。然后,我为每个文件调用getDimension。getDimension方法和每种图像类型的每个实现都分别进行了测试(单独运行)。下面是我得到的执行时间(第一个数字是jpg,第二个数字是png):
1(Apurv) - 101454ms, 84611ms
2(joinJpegs) - 471ms, N/A
3(Andrew Taylor) - 707ms, 68ms
4(Karussell, ImageIcon) - 106655ms, 100898ms
5(user350756) - 2649ms, 68ms
很明显,一些方法加载整个文件是为了获取尺寸,而另一些方法只是从图像中读取一些头信息。我认为当应用程序性能非常关键时,这些数字可能会很有用。
感谢大家对这个帖子的贡献--非常有用。
https://stackoverflow.com/questions/672916
复制相似问题