Существует ли 100%-я альтернатива Java ImageIO для чтения файлов JPEG?

Мы используем Java2D для изменения размеров фотографий, загруженных на наш веб-сайт, но мы сталкиваемся с проблемой (на вид старый, cf.: http://forums.sun.com/thread.jspa?threadID=5425569) - несколько конкретных JPEGs повышают a 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.(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() вызов, код сервлета и такой)

Мы сузили его к фотографиям, взятым определенные камеры, и я выбрал фотографию, которая инициировала эту ошибку: http://img214.imageshack.us/img214/5121/estacaosp.jpg. Мы заметили, что это только происходит с JVM Sun (на Linux и Mac, просто протестировал его на 1.6.0_20) - тестовая машина с OpenJDK читает те же фотографии без помехи, возможно из-за другой реализации читателя JPEG.

К сожалению, мы не можем переключить JVMs в производство, ни использовать собственно-зависимые решения, такие как ImageMagick (http://www.imagemagick.org/).

По этой причине, мой вопрос: замена для читателя ImageIOs JPEG, который может обработать фотографии, такие как связанная, существуют? В противном случае есть ли другая 100%-я чистая фотография Java, изменяющая размер решения, которое мы можем использовать?

Спасибо!

20
задан chesterbr 8 June 2010 в 17:02
поделиться

1 ответ

Одной из возможных полезных библиотек для вас может быть 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);
    }

После выполнения этого кода изображение загружается нормально. Затем оно изменяется на 50% с помощью ParamaterBlock

И, наконец, если вы хотите сохранить файл, вы можете просто вызвать :

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

Надеюсь, это вам поможет. Желаю удачи.

12
ответ дан 30 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: