java无法在unix中编写bmp映像

时间:2014-07-26 09:06:11

标签: java unix javax.imageio

尝试在unix中写入bmp单色文件时出错

我正在使用java在unix中创建和保存单色位图但是当我尝试使用以下方法保存它时:

ImageIO.write(image, "Microsoft Windows BMP", new File(resImagePath))

保存一个完整的黑色文件并抛出IOException:

http://i57.tinypic.com/2re6pv5.png

java verion是1.4.2

支持的格式如图所示

文件已创建,但全黑或全白

完整代码:

final BufferedImage image = new BufferedImage(1016, 648, BufferedImage.TYPE_BYTE_BINARY);
Graphics2D g = image.createGraphics();

g.setColor(Color.white);
g.fillRect(0,324,1016,648);

g.setColor(Color.black);
g.drawString("Text Here", 100, 100);

gnu.javax.imageio.bmp.BMPImageWriterSpi bmp_writer = new gnu.javax.imageio.bmp.BMPImageWriterSpi();
bmp_writer.getWriterInstance();
registry.registerServiceProvider(bmp_writer);

if (ImageIO.write(image, "Microsoft Windows BMP", new File(resImagePath)))
    System.out.println("ok");
else {
    String names[] = ImageIO.getWriterFormatNames();
    for (int i = 0; i < names.length; i++)
        System.out.println("writer " + names[i]);
}

2 个答案:

答案 0 :(得分:1)

使用bmp代替Microsoft Windows BMP

ImageIO.write(image, "bmp", new File(resImagePath));

本身,ImageIO不会修改图像数据(超出格式要求),要生成单色图像,您需要自己转换图像数据,例如......

Monochrome

try {
    BufferedImage master = ImageIO.read(new File("source image"));

    BufferedImage blackWhite = new BufferedImage(master.getWidth(), master.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
    Graphics2D g2d = blackWhite.createGraphics();
    g2d.drawImage(master, 0, 0, this);
    g2d.dispose();

    ImageIO.write(blackWhite, "bmp", new File("Test.bmp"));
} catch (IOException exp) {
    exp.printStackTrace();
}

以上代码生成以下输出...

Monochrome

<强>更新

您的代码中还会有更多内容然后遇到眼睛,例如,这有效...

    final BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_BYTE_BINARY);
    Graphics2D g = image.createGraphics();

    g.setColor(Color.WHITE);
    g.fillRect(0, 0, 200, 200);

    g.setColor(Color.BLACK);
    g.drawRect(0, 0, 199, 199);
    FontMetrics fm = g.getFontMetrics();
    g.drawString("Text Here", 0, fm.getAscent());

    g.dispose();

    try {
        ImageIO.write(image, "BMP", new File("test.bmp"));
    } catch (IOException ex) {
        Logger.getLogger(TestTextImage.class.getName()).log(Level.SEVERE, null, ex);
    }

BMP

但是在你的代码中,你正在做......

g.setColor(Color.white);
g.fillRect(0,324,1016,648);

只填充您的1016x648)图像的一部分...

但是你呢......

image_graphic.setColor(Color.black);
image_graphic.drawString("Text Here", 100, 100);

我不知道image_graphic指的是什么......

永远不应该有任何理由直接实例化ImageWriter,这是ImageIO

的重点

答案 1 :(得分:0)

一些问题解决了。

我编辑BMPImageWriter.java文件和方法write()。

评论关闭流的最后一行

//out.close();

已完成,但当我使用 TYPE_BYTE_BINARY

时,系统仍会打印全黑图像
final BufferedImage image = new BufferedImage(1016, 648, BufferedImage.TYPE_BYTE_BINARY);

如果我使用 TYPE_INT_RGB 或任何彩色格式,它将保存正确,我生气:((