2016-04-04 58 views
0

Aşağıdaki kod kullanılarak bir görüntüden elde edilen bayt dizilim var.Bayt dizisinin png'ye dönüştürülmesi

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(); 

Ardından, aşağıdaki kodu kullanarak bu baytları tekrar png görüntüsüne dönüştürdüm.

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

Bu kod parçasını çalıştırırsam, gayet iyi. i aradaki bayt bazı değiştirmeye çalışırsanız Ama, böyle ki:

Insert_number_to_image(image_in_bytes, 10); 

ve benim yöntemi "Inset_number_to_image" şöyledir: i kaydederken

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++; 
     } 
    } 
} 

ondan sonra, modifiye aynı kodu kullanarak png görüntü olarak bayt dizisi bu hata alıyorum, yukarıda belirtilen: kullandığınız ne

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) 

cevap

3

PNG resmin ham Bytestream olduğunu. Bytestream doğrudan piksel değerlerinden herhangi birini yansıtmadığı ve hatta bir baytı değiştirdiği dosyanın geri dönüşü olmayan şekilde bozulabileceği PNG is a compressed format.

Bunun yerine ne istediğinizi istediğiniz gibi Şimdi piksel değerlerini değiştirebilir

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

ile bir bayt dizisi piksel veri ayıklamak etmektir. Geriye bir dosyaya kaydetmek için hazır olduğunuzda, DataBufferByte nesnesinde piksel dizinizi koyarak ve BufferedImage oluşturmak için kullandığınız bir WriteableRaster geçirerek, convert the pixel byte array to a BufferedImage.

Yönteminiz, ham bytestream öğesinin, BMP gibi doğrudan pikselleri temsil ettiği biçimler için çalışır. Ancak, daha sonra, üstbilgiyi bozmamak için ilk birkaç baytı atlamanız gerekir.