ImageIO.write bmp не работает

Я пытаюсь сохранить изображение в формате bmp, но он не создает никакого файла. Если я использую "png", все работает нормально. Любые идеи?

//This works fine:
ImageIO.write(bi, "png", new File("D:\\MyImage.png"));

//This does not work:
ImageIO.write(bi, "bmp", new File("D:\\MyImage.bmp"));

ImageIO.getWriterFormatNames() дает мне "jpg", "bmp", "jpeg" и некоторые другие.

Спасибо заранее.

Якоба

Ответ 1

Я только что закончил отладку аналогичной проблемы, и я подумал, что буду приводить свои аргументы здесь, хотя Jakob пошел вперед в формате PNG.

Сначала всегда проверяйте возвращаемое значение ImageIO.write(...). Он вернет false, если не будет найден подходящий писатель и что должно было произойти, когда Якоб попытался записать его как растровое изображение. Это происходит, когда фактический формат изображения файла не соответствует тому, что указано в аргументе "имя формата". Никакое исключение не возникает в этом случае. Просмотрите документы в http://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageIO.html#write (java. awt.image.RenderedImage, java.lang.String, java.io.File)

Во-вторых, проверьте тип изображения объекта BufferedImage с помощью метода BufferedImage # getType(). Проверьте возможные возвращаемые значения http://docs.oracle.com/javase/7/docs/api/java/awt/image/BufferedImage.html#getType(). Например, если вы получаете тип TYPE_INT_ARGB из вашего объекта BufferedImage (который представляет PNG с альфа-компонентом), вы не будете иметь успех с помощью ImageIO.write(bi, "BMP", new File("D:\\test.bmp")), и метод вернет false, хотя вы можете увидеть BMP/BMP в списке записей, полученных с помощью ImageIO.getWriterFormatNames(). Возможно, вам придется работать с кодировкой и преобразовывать изображение в нужный формат.

В-третьих, при столкновении с такими проблемами, которые иногда могут быть больно, всегда помогает использовать редактор изображений, например GIMP, чтобы проверить подробно изложите свои свойства изображения.

@Зеленая стрелка, незначительная заметка... вы можете использовать либо "bmp", либо "BMP" в качестве значения формата изображения. То же самое относится и к другим форматам. Это не имеет значения.

Ответ 2

Как указывает @bincob, если запись возвращает false, вы можете перерисовать исходное изображение, подобное этому

BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), 
bufferedImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);

И затем вы можете снова написать.

Ответ 3

не пробовал, но я думаю, что формат должен быть "BMP", а не "bmp". Попробуйте

ImageIO.write(bi, "BMP", new File("D:\\MyImage.bmp"));

и посмотрим, что произойдет.

Мы не можем видеть, как строится ваш бит.

BufferedImage bufferedImage = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

Правильно ли установлен тип encodingType?

Я думаю, что ваш bi поврежден, что отлично работает для меня.

BufferedImage bi = new BufferedImage(50,50,BufferedImage.TYPE_INT_RGB);
Graphics gd = bi.getGraphics();
gd.drawRect(0, 0, 10, 10);      
try {
    ImageIO.write(bi, "BMP", new File("C:\\test.bmp"));
    ImageIO.write(bi, "PNG", new File("C:\\test.png"));
} catch (IOException e) {
    System.out.println("error "+e.getMessage());
}