当前位置: 首页 > 面试题库 >

是否有100%Java替代ImageIO来读取JPEG文件?

赏夕
2023-03-14
问题内容

我们正在使用Java2D调整上传到我们网站的照片的大小,但是遇到了一个问题(一个看似古老的文件,请参阅:http
:
//forums.sun.com/thread.jspa?threadID=5425569)-一些特定的JPEG
CMMException当我们尝试ImageIO.read()输入包含其二进制数据的InputStream 时引发:

java.awt.color.CMMException: Invalid image format
 at sun.awt.color.CMM.checkStatus(CMM.java:131)
 at sun.awt.color.ICC_Transform.<init>(ICC_Transform.java:89)
 at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1114)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1082)
 at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897)
 at javax.imageio.ImageIO.read(ImageIO.java:1422)
 at javax.imageio.ImageIO.read(ImageIO.java:1326)
    ...

(删除了堆栈跟踪的其余部分,这是我们的ImageIO.read()调用,servlet代码等)

我们将其范围缩小到使用特定相机拍摄的照片,我选择了触发该错误的照片:http
:
//img214.imageshack.us/img214/5121/estacaosp.jpg。我们注意到,这仅在Sun的JVM(在Linux和Mac上,仅在1.6.0_20上对其进行过测试)上发生-
使用OpenJDK的测试机可以毫无困难地读取相同的照片,这可能是由于JPEG阅读器的实现方式不同所致。

不幸的是,我们无法在生产环境中切换JVM,也无法使用依赖于本机的解决方案,例如ImageMagick(http://www.imagemagick.org/)。

考虑到这一点,我的问题是:是否存在可以处理照片(例如链接的照片)的ImageIOs
JPEG阅读器的替代品?如果没有,还有另外一种我们可以使用的100%纯Java照片大小调整解决方案吗?

谢谢!


问题答案:

对您而言可能有用的一个库可能是Java Advanced Imaging
Library(JAI)。

使用此库可能比使用ImageIO复杂得多,但是在我刚刚运行的快速测试中,它确实打开并显示了您链接的问题图像文件。

public static void main(String[] args) {
        RenderedImage image = JAI.create("fileload", "estacaosp.jpg");

        float scale=(float) 0.5;

        ParameterBlock pb = new ParameterBlock();
        pb.addSource(image);

        pb.add(scale);
        pb.add(scale);
        pb.add(1.0F);
        pb.add(1.0F);

        pb.add(new InterpolationNearest() );// ;InterpolationBilinear());
        image = JAI.create("scale", pb);

        // Create an instance of DisplayJAI.
        DisplayJAI srcdj = new DisplayJAI(image);

        JScrollPane srcScrollPaneImage = new JScrollPane(srcdj);

// Use a label to display the image
        JFrame frame = new JFrame();

        frame.getContentPane().add(srcScrollPaneImage, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

运行此代码后,图像似乎可以正常加载。然后使用ParamaterBlock将其调整为50%

最后,如果您想保存文件,可以致电:

String filename2 = new String ("tofile.jpg");
  String format = new String ("JPEG");
  RenderedOp op = JAI.create ("filestore", image, filename2, format);

我希望这能够帮到你。祝你好运。



 类似资料:
  • 根据API,Java的ImageIO为方法。 其中两种方法是: Oracle教程网站使用readfrom file方法。然而,我已经看到了许多由程序员编码的例子,这里更喜欢使用URL方法。 Exmaple: 我的问题是:如果我只是为Java桌面应用程序(而不是Java小程序)编写代码。与其他方法相比,使用URL方法是否有显著优势? 注意:在SO:usingurl或File(在ImageIO.rea

  • 问题内容: 我正在尝试将BufferedImage写入jpeg文件,但是我的Java程序引发了异常。我能够成功将相同的缓冲区保存为gif和png。我尝试在Google上四处寻找解决方案,但无济于事。 码: 例外: 问题答案: OpenJDK没有本地JPEG编码器,请尝试使用Sun的JDK或使用库(例如JAI) AFAIK,关于“粉红色色调”,Java将JPEG保存为ARGB(仍然具有透明度信息)。

  • 问题内容: 我不知道为什么这不起作用,但是程序说它无法读取输入文件。顺便说一下,这也在Ubuntu中运行: 这是示例代码: 该目录也位于程序的bin文件夹和src文件夹中。 问题答案: 如果您改为从资源流中获取图像怎么办?例如,

  • 问题内容: 这是我的第一篇文章,请问如果我做错了什么。直到我尝试从源包中读取图像,此代码才能正常运行。但是现在它无法读取任何图像。我究竟做错了什么?还是关于日食的事? 例外: 谢谢… 问题答案: 改变了,如果你使用的是Windows。 更跨平台的方法将替代 对于每对。 进一步了解File api文档 编辑 (对不起,我没有读过此行) 这段代码运行正常,直到我尝试从源包中读取图像 为了从jar包中获

  • 问题内容: py2exe是否有替代品? 问题答案: cx_Freeze是跨平台的,并且具有相同的功能,或者您可以使用py2app,它仅在Mac上有效。

  • 问题内容: 我试图通过FOP渲染大约100,000-80列记录,并且每次都几乎耗尽(OutOfMemoryException)。我知道iText可以处理这种负载,但是由于LGPL许可证,我无法使用它。iText是否有其他Java库可以处理将大量数据呈现为PDF的问题? 问题答案: 有商业PDF生成库,例如BFO和ElegantJ。如果您需要开源,则有PDFBox,但我不知道它是否已准备好投入生产。