2015-04-27 57 views
1

正如標題所暗示的那樣,我試圖用Java編寫一個字節數組到一個bmp文件。目前,我的程序已成功將數據寫入文件位置,但它似乎缺少數據,因此無法打開。在下面列出的兩個功能中,目標是:將一個字節數組寫入一個bmp java

fromImage獲取灰度bmp圖像字節數據並將每個整數轉換爲二進制字符串,然後將其存儲在LinkedList節點中。 toImage接受該LinkedList,將二進制字符串轉換回整數,然後將新的字節數組寫回另一個文件。

public static LinkedList<String> fromImage(BufferedImage img) { 
    LinkedList<String> new_buff = new LinkedList<String>(); 
    //try{ 
     //img = ImageIO.read(new File("img/lena.bmp")); 
     byte[] byte_buffer = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); 

     for(byte b : byte_buffer){ 
      String buffer; 
      buffer = Integer.toBinaryString(b & 255 | 256).substring(1); 
      new_buff.addLast(buffer); 
      //System.out.println(buffer); 
     } 
    //}catch(IOException e){} 
    System.out.println("Exiting fromImage"); 
    return new_buff; 
} 

// Save a binary number as a BMP image 
// Image input hardcoded atm 
public static BufferedImage toImage(LinkedList<String> bi) { 
    BufferedImage img = null; 
    int b; 
    byte[] bytes = new byte[bi.size()]; 
    for(int i = 0; i < bi.size(); i++){ 
     String temp = bi.get(i); 
     b = Integer.parseInt(temp); 
     bytes[i] = (byte) b; 
     //System.out.println(i); 
    } 
    System.out.println("Exiting For loop"); 
    try{ 
     Files.write(Paths.get("img/encrypted.bmp"), bytes); 
     //img = ImageIO.read(new File("img/lena.bmp")); 
     //ImageIO.write(img, "bmp", new File("img/encrypted.bmp")); 
     //img = ImageIO.read(new File("img/encrypted.bmp")); 
    }catch(IOException e){} 
    System.out.println("Exiting toImage"); 
    return img; 
} 

所以,最後,我的問題是 - 哪裏是我缺少的數據,所以我錯過了它,我能做些什麼來解決這個問題?

+0

什麼是通過'LinkedList '關於?你可以單元測試,這真的有效嗎(即可以正確地往返一個字節[]')? – Thilo

+0

我不是100%確定我明白你在問什麼,但是我將它作爲LinkedList 存儲的原因是因爲從原始圖像中提取的像素字節是整數,我需要在最小有效位上進行更改二進制數字。 – JustKeepSwimming

回答

3

BMP有file structure

在這裏,您正在寫入一個名爲「encrypted.bmp」的文件,因此我認爲您的字節是某種東西的加密,因此不代表有效的bmp文件。

您將不得不遵守BMP文件結構,添加一個頁眉和頁腳,以使您的字節爲例如。 BMP文件的像素部分。

最簡單的方法是將圖像寫入BufferedImage img,然後使用ImageIO.write(img, "BMP", new File("encrypted.bmp"))

+0

好的。這就是朋友所建議的。你有什麼建議,我可以學習如何添加缺少的頁眉/頁腳信息?目前,沒有加密的信息。加密將是像素二進制數據的最不重要的位變化,但是我還沒有實現那部分。 – JustKeepSwimming

+0

維基百科鏈接具有完整的文件結構,因此您可以使用它來編寫位圖。否則,[本站](http://www.fileformat.info/format/bmp/egff.htm)似乎很清楚如何使用BMP文件格式。如果你不想重新發明輪子,只需使用'ImageIO.write(img,「BMP」,new File(「encrypted.bmp」))',其中'img'是一個帶有像素值的'BufferedImage'。 – Ekleog

+0

我以前使用過ImageIO,並且遇到了麻煩,但是現在看起來我可能錯誤地使用了它,現在我正在查看它。感謝您的幫助。 – JustKeepSwimming

相關問題