(расширяя мои комментарии)
Проблема сводится к следующему: люди обычно считают, что «формат» задается следующей командой:
ImageIO.getReaderFileSuffixes();
поддерживаются Java.
Но это не так, как его следует читать / понимать, потому что это просто не то, как оно работает.
Неправильно: "ImageIO может читать любой файл, закодированный в одном из этих форматов"
Правильно: "ImageIO не может прочитать изображение, закодированное в формате, который не относится к этим форматам"
Но что теперь это говорит о форматах, фигурирующих в этом списке? Ну ... Становится сложно.
Например, этот список обычно возвращает как «PNG», так и «BMP» (и другие форматы). Но нет ни «одного» PNG, ни «одного» BMP. Я могу прийти завтра с «действительным» форматом PNG (под), который был бы прекрасно, но ни один декодер PNG там не декодировал бы (это нужно было бы проверить и принять: но как только он будет принят, он «сломается» "все существующие декодеры PNG там). К счастью, для изображений PNG проблема не так уж и плоха.
Формат BMP очень сложный. Вы можете иметь сжатие или нет (что может объяснить различный размер файла, который вы видели). Вы можете иметь различные заголовки (разной длины, что также может объяснить различный размер файла, который вы видели). Черт, BMP на самом деле настолько сложен, что я думаю, что вы можете встроить пиксели в формате PNG в «оболочку» BMP.
Существует два основных типа файлов BMP:
- Варианты BMP, появившиеся после создания Java-декодера
- Варианты BMP, которые достаточно неясны, чтобы разработчики Java ImageIO не считали его достойным поддержки
«Ошибка» заключается в том, что существует один формат PNG или один BMP. Оба формата (и другие форматы изображений тоже) на самом деле «расширяемые». Каждый раз, когда выходит новый вариант, он может сломать любой декодер.
Итак, что происходит в вашем случае, это:
вы читаете свой оригинальный файл BMP из MS Paint, и MS Paint может прочитать этот файл, потому что это формат BMP, который понимает MS Paint.
тот же формат BMP не соответствует используемой вами версии Java (есть надежда, что он будет поддерживаться в другой версии Java, но я бы на это не рассчитывал).
когда вы повторно сохраняете этот файл из MS Paint, вы сохраняете в формате BMP, который определенно не совпадает с исходным форматом (изменяющийся размер файла довольно очевиден) )
этот другой формат поддерживается вашей версией Java.
Теперь, чтобы действительно решить вашу проблему: по моему опыту библиотеки изображений, такие как ImageMagick , могут читать намного больше изображений, чем API Java ImageIO по умолчанию, поэтому я бы посмотрел либо на другие библиотеки изображений, либо обертки вокруг ImageMagick .
Эти библиотеки также обычно обновляются, чтобы поддерживать новые варианты и новые форматы намного быстрее, чем Java. Например, удивительный формат WebP от Google (на 28–34% лучше, чем PNG для изображений без потерь + полупрозрачные изображения) уже поддерживается некоторыми библиотеками для работы с изображениями, но я не затаив дыхание, когда он приходит сделать ImageIO.read (someWebPpicture) ...
Другой вариант - использовать PNG: даже если теоретически PNG может быть расширен, вы вряд ли найдете «не поддерживаемые» PNG в дикой природе. С BMP это слишком часто.