2016-04-04 42 views
0

次のコードを使用してイメージからバイト配列を取得しました。バイト配列をpngに変換する

String path = "/home/mypc/Desktop/Steganography/image.png"; 
File file = new File(path); 
BufferedImage bfimage = ImageIO.read(file); 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ImageIO.write(bfimage, "png", baos); 
baos.flush(); 
byte[] img_in_bytes = baos.toByteArray(); 
baos.close(); 

次に、これらのバイトを次のコードを使用してpngイメージに変換しました。

BufferedImage final_img = ImageIO.read(new ByteArrayInputStream(img_in_bytes)); 
File output_file = new File("Stegano2.png"); 
ImageIO.write(final_img, "png", output_file); 

このコードを実行するだけでも問題ありません。しかし、私が間にバイトの一部を変更しようとすると、次のように言う:

Insert_number_to_image(image_in_bytes, 10); 

と私の方法「Inset_number_to_imageは、」このように書きます:その後、その後

static void Insert_number_to_image(byte[] image, int size){  
    byte[] size_in_byte = new byte[4]; 
    size_in_byte[0] = (byte)(size >>> 0); 
    size_in_byte[1] = (byte)(size >>> 8); 
    size_in_byte[2] = (byte)(size >>> 16); 
    size_in_byte[3] = (byte)(size >>> 24); 

    byte temp; 
    int count = 0; 

    for(int i=0; i<4; i++) 
    { 
     for(int j=0; j<8; j++) 
     { 
      temp = size_in_byte[i]; 
      temp = (byte)(temp >>> j); 
      temp = (byte)(temp & 1); 
      if(temp == 1) 
      { 
       image[count] = (byte)(image[count] | 1); 
      } 
      else if(temp == 0) 
      { 
       image[count] = (byte)(image[count] & (byte)(~(1))); 
      } 
      count++; 
     } 
    } 
} 

、私は変更を保存するとき上記の同じコードを使用して、pngイメージとして2バイト配列を返します。

Exception in thread "main" java.lang.IllegalArgumentException: image == null! 
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925) 
    at javax.imageio.ImageIO.getWriter(ImageIO.java:1591) 
    at javax.imageio.ImageIO.write(ImageIO.java:1520) 
    at Steganography.main(Steganography.java:211) 

答えて

3

使用しているのは、PNG画像の生のバイトストリームです。 PNG is a compressed format。バイトストリームはピクセル値を直接反映せず、1バイトを変更しても不可逆的にファイルが破損する可能性があります。あなたの代わりに欲しい

は、あなたが欲しいしかし、今、あなたはピクセル値を変更することができ

byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData(); 

をバイト配列にピクセルデータを抽出することです。ピクセルに保存する準備ができたら、convert the pixel byte array to a BufferedImageピクセル配列をDataBufferByteオブジェクトに入れてWriteableRasterに渡してからBufferedImageを作成します。

この方法は、生のバイトストリームがピクセルを直接表す形式(たとえば、BMP)で機能します。しかし、ヘッダーを破損しないように、最初の数バイトをスキップする必要があります。

関連する問題