Мы используем 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, изменяющая размер решения, которое мы можем использовать?
Спасибо!
Одной из возможных полезных библиотек для вас может быть 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);
Надеюсь, это вам поможет. Желаю удачи.