2014-07-26 56 views
0

錯誤試圖寫入到bmp黑白文件在UNIX的java無法寫入BMP圖像在UNIX

我使用Java創建並保存一個單色位圖在UNIX,但是當我試圖挽救它使用:

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

保存了全黑色的文件,並拋出IOException:

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

優化版本的Java 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]); 
} 
+0

確保在寫入圖像之前處理Graphics上下文。應該沒有必要像這樣實例化一個編寫器,因爲實現可能在平臺之間改變,你應該問ImageIO註冊的實現 – MadProgrammer

+0

我測試了你的代碼,並且在糾正了那些不能編譯和確保的部分之後整個圖像被填充,而不僅僅是它的一部分,它對我很好 – MadProgrammer

回答

0

使用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

+0

bmp不支持,我使用ImageIO.getWriterFormatNames(),它說我應該使用「Microsoft Windows BMP」 – Farrokh

+0

你試過PNG ... – MadProgrammer

+0

你也可以嘗試BMP而不是bmp,不要在PC上測試 – MadProgrammer

0

一些問題解決的關鍵所在。

我編輯BMPImageWriter.java文件和方法write()。

評論最後一行關閉流

//out.close(); 

和完成,但系統仍然打印全黑圖像當我使用TYPE_BYTE_BINARY

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

如果我使用TYPE_INT_RGB或任何彩色格式它將保存正確,我生氣:((

+0

原始圖像是什麼樣的? – MadProgrammer

+0

這是一個在代碼中創建的新圖像,並添加了4行文字 – Farrokh

+0

您是否嘗試將圖像以不同的顏色格式保存以進行測試? – MadProgrammer