Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > реверс изображения при ImageIO


Автор: carper 17.3.2010, 17:53
Есть баг, описанный в http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4881314

Суть очень проста:
Вот такой вот код, который просто берет картинку из одного файла и пишет ее в другой:
Код

File inFile = new File(inname);
BufferedImage  customer  = ImageIO.read(inFile);
File outFile = new File(outname);
ImageIO.write( customer , "jpg", outFile);


Не верно работает с определенными jpg файлами.
А именно, при сохранении получаем картинку с "инвертированными" цветами.

Предложенное в обсуждении бага решение проблемы:
Код

  ....
  BufferedImage image2 = 
     new BufferedImage( image.getWidth(), image.getHeight(),  BufferedImage.TYPE_INT_RGB);
     image2.getGraphics().drawImage( image, 0, 0, null );
     ImageIO.write( image2, format, file );



Не работает для исходного файла, имеющего (по мнению JAVA) тип TYPE_3BYTE_BGR.

Что интересно, попытки пересохранения исходного файла из любого вьювера, с тем же, или другим расширением, тут же решают эту проблему.

При этом ни один вьювер не показал, чем же отличаются эти файлы, да и не вижу смысла искать эти различия, т.к. аналогичные файлы показываются везде (по крайней мере ни один из имеющихся у меня просмоторщиков, а также Photoshop не имели никаких проблем с отображением и сохранением этого файла) без проблем и это не единичный случай "испорченного" файла.


Есть ли пути решения этой проблемы?


Да, проблемный файлик с именем myimage.jpg и результат его пересохранения с именем
image.jpg, в сумме на 1.3Mb можно забрать с 

http://ifolder.ru/16891328
http://ifolder.ru/16891318 



Автор: Дрон 17.3.2010, 19:05
Какая версия Java используется? 
Я сегодня-завтра посмотрю -- бага для меня интересная так как я много занимался изображениями в Java.

Автор: Дрон 17.3.2010, 21:55
Что-то с ifolder не могу скачать, висит он похоже.

Попробую пока так что-нибудь предложить. Например загрузить не через ImageIO, а через JAI.
Идём сюда: https://jai.dev.java.net/binary-builds.html
Скачиваем например вариант Java (no native acceleration) и добавляем в Class Path (так это вроде зовётся) своего приложения ссылки на jai_core.jar и jai_codec.jar

Тогда прочитать можно будет так:
Код
RenderedImage customer = javax.media.jai.operator.FileLoadDescriptor.create(inname, null, false, null);

А записать можно и по-старому.

Единственное отличие, что на выходе получается RenderedImage, а не BufferedImage, но это не должно быть проблемой.

Ну и ещё одно замечание -- при таком подходе из JPEG потеряется встроенный цветовой профиль (если он был, конечно), чтобы его сохранить надо ещё несколько шагов сделать. Но для начала надо с загрузкой разобраться.

Цитата(carper @  17.3.2010,  17:53 Найти цитируемый пост)
Не работает для исходного файла, имеющего (по мнению JAVA) тип TYPE_3BYTE_BGR.

Как именно не работает? Фразы вроде "не работает" это для домохозяек и бухгалтерш, программист должен чётко формулировать свою проблему smile

Автор: carper 18.3.2010, 09:35
Версия JAVA 1.6.0_17-b04

"Как именно не работает? "
Уже описал - вновь сохраненное изображение выглядит инвертированным, также 
приложил ссылки (упс, см. окончание сообщения) по которым можно посмотреть оба изображения.

Вот инфа, АБСОЛЮТНО ОДИНАКОВАЯ для исходного и пересохраненного файлов:
1600x1068
Бит на план 24
Цветовая модель RGB (ага, для исходного тоже она)
N плана 1
Бит на пиксель 24
Сжатие JPEG
Формат JPEG TrueColor(v1.1)


А вот РАЗНАЯ из EXIF, сначала для исходного файла:

BitsPerSample        8
ColorComponenets 3
YCbCrSubSampling YCbCr4:4:4 (1 1)
EncodingProcess     Baseline DCT, Huffman coding


А теперь для пересохраненного: 

BitsPerSample        8
ColorComponenets 3
YCbCrSubSampling YCbCr4:2:0 (2 2)
JIFFVersion 1.02                                  -- Этого параметра для исходного файла нет вообще
ResolutionUnit        None                     -- Этого параметра для исходного файла нет вообще
YResolution  1                                     -- Этого параметра для исходного файла нет вообще
EncodingProcess     Baseline DCT, Huffman coding

Вот кусочек заголовка "нормального" изображения:
Код

  яШяЫ „ яА ,@ яЭ  ИяДў                 
                 
     u!" 1A2#    QBa$3RqЃb‘%CЎ±р&4r
БС5'бS6‚с’ўDTsEF7Gc(UVWІВТвтdѓt“„eЈіГУг)8fуu*9:HIJXYZghijvwxyz…†‡€‰Љ”•–—˜™љ¤Ґ¦§Ё©Єґµ¶·ё№єДЕЖЗИЙКФХЦЧШЩЪдежзийкфхцчшщъ m!1 "AQ2aqBЃ#‘RЎb3    ±$БСCrрб‚4%’ScDсўІ&5T6Ed'
sѓ“FtВТвтUeuV7„…ЈіГУгу)”¤ґДФдф•ҐµЕХех(GWf8v†


Вот "изуродованного"
Код

яШяа JFIF      яЫ C         
 
   $.' ",#(7),01444'9=82<.342яЫ C              

2!!22222222222222222222222222222222222222222222222222яА ,@" яД               
яД µ   } !1AQa"q2Ѓ‘Ў#B±БRСр$3br‚    
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ„…†‡€‰Љ’“”•–—˜™љўЈ¤Ґ¦§Ё©ЄІіґµ¶·ё№єВГДЕЖЗИЙКТУФХЦЧШЩЪбв


P.S. про библиотеку jai в курсе, но не хотелось бы плодить сущности без необходимости, т.к. мне
в общем-то были нужны простейшие операции - типа загрузить jpeg, отмасштабировать, сохранить обратно.

Да, по поводу ifolder:
"Сервис iFolder приостановлен следователями 3-й ЧС ГСУ при ГУВД Москвы."

Тут форум программистский и посещаемый не только мужчинами, поэтому писать, что я думаю обо всем этом воздержусь. 

Вот новые ссылки, возможно до этого сервиса эти еще не успеют добраться.

http://www.megaupload.com/?d=YEKJX064
http://www.megaupload.com/?d=P3NETXWE 


Автор: Дрон 18.3.2010, 09:42
О, как я удачно зашёл.

Скачал фотографии, ну что ж могу поздравить, моя софтина тоже её неправильно читает.
Буду разбираться smile

Автор: Дрон 19.3.2010, 14:38
В общем, кроме как через JAI нормально прочитать не получается. Почему -- не ясно, лезть в дебри этого файла времени нет.
Но мне кажется, что проблема именно в чтении, а не в записи, потому что если читать через JAI, а сохранять через ImageIO, то всё нормально.

Попробовал ещё шутки ради через Toolkit.getDefaultToolkit().createImage, но тот, похоже, вообще эту картинку прочитать не может.

Автор: carper 22.3.2010, 09:30
Спасибо.
Обидно, придется использовать JAI, а всего-то и было нужно - ресайзить картинку под аватары. :(
И, таки да, похоже проблема в чтении, скорее всего где-то неверно определятся формат.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)