2012-07-03 54 views
1

我想將任何文件轉換爲PNG,並且還要將所有這些過程都轉換爲Java。在Java中將任何文件轉換爲PNG

我想爲圖像使用int-RGB形式,並且文件中的字節是RGB整數中的一個字節。這應該會產生一個圖像。

我已經得到這個工作,只存儲在紅色的字節,但我不知道如何也使用綠色和藍色。

這是我的那一刻,只使用紅色使用的代碼,並能正常工作:

public static void fileToImage(String sourceFile, String imageFile) throws IOException { 
    DataInputStream dis = new DataInputStream(new FileInputStream(sourceFile)); 
    int size = ((int) Math.sqrt(dis.available())) + 2; 
    BufferedImage image = new BufferedImage(size,size, BufferedImage.TYPE_INT_RGB); 
    for (int y = 0; y < size; y++) { 
     for (int x = 0; x < size; x++) { 
      int red = dis.read(); // I'm using only red 
      int green = 0; // default 
      int blue = 0; // default 
      int rgb = (0xFF << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF); 
      image.setRGB(x, y, rgb); 
     } 
    } 
    dis.close(); 
    ImageIO.write(image, "png", new File(imageFile)); 
} 

public static void imageToFile(String imageFile, String outputFile) throws IOException { 
    BufferedImage image = ImageIO.read(new File(imageFile)); 
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(outputFile)); 
    for (int y = 0; y < image.getHeight(); y++) { 
     for (int x = 0; x < image.getWidth(); x++) { 
      int rgb = image.getRGB(x, y); 
      int red = (rgb >> 16) & 0xFF; 
      int green = (rgb >> 8) & 0xFF; 
      int blue = rgb & 0xFF; 
      dos.write(red); // I'm using only red 
     } 
    } 
    dos.close(); 
} 

編輯:好的,所以我已經修改了代碼,那就是:

public static void fileToImage(String sourceFile, String imageFile) throws IOException { 
    DataInputStream dis = new DataInputStream(new FileInputStream(sourceFile)); 
    int size = ((int) Math.sqrt(dis.available())) + 2; 
    BufferedImage image = new BufferedImage(size,size, BufferedImage.TYPE_INT_RGB); 
    for (int y = 0; y < size; y++) { 
     for (int x = 0; x < size; x++) { 
      int red = dis.read(); 
      int green = dis.read(); 
      int blue = dis.read(); 
      int rgb = (0xFF << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF); 
      image.setRGB(x, y, rgb); 
     } 
    } 
    dis.close(); 
    ImageIO.write(image, "png", new File(imageFile)); 
} 

public static void imageToFile(String imageFile, String outputFile) throws IOException { 
    BufferedImage image = ImageIO.read(new File(imageFile)); 
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(outputFile)); 
    for (int y = 0; y < image.getHeight(); y++) { 
     for (int x = 0; x < image.getWidth(); x++) { 
      int rgb = image.getRGB(x, y); 
      int red = (rgb >> 16) & 0xFF; 
      int green = (rgb >> 8) & 0xFF; 
      int blue = rgb & 0xFF; 
      dos.write(red); 
      dos.write(green); 
      dos.write(blue); 
     } 
    } 
    dos.close(); 
} 

這是「工作」,但不完全如預期。製作的PNG中有很多黑色空間,因爲我認爲圖像的「大小」是錯誤的。因此,將PNG轉換回原始文件時,它會比原來大得多。

編輯:我現在的問題是這樣的:例如,如果我使用fileToImage方法將具有以下內容的文本文件轉換爲PNG:hello world!然後我使用imageToFile將其轉換回來,輸出是:hello world!SSSSSSSSSSSSSSSSS(S代表「空間」,有15個)

編輯:仍然無法弄清楚這一點。以下是我正在使用的:

private static final int NAN = -1; 

private static int readByte(DataInputStream dis) throws IOException { 
    int b; 
    try { 
     b = dis.readByte(); 
    } catch (EOFException e) { 
     b = NAN; 
    } 
    return b; 
} 

public static void fileToImage(String sourceFile, String imageFile) throws IOException { 
    DataInputStream dis = new DataInputStream(new FileInputStream(sourceFile)); 
    int size = ((int) Math.sqrt(dis.available())) + 2; 
    BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB); 
    for (int y = 0; y < size; y++) { 
     boolean finished = false; 
     for (int x = 0; x < size; x++) { 
      int alpha = 3; 
      int red = readByte(dis); 
      int green = readByte(dis); 
      int blue = readByte(dis); 
      if (red == NAN) { 
       alpha--; 
       red = 0; 
      } 
      if (green == NAN) { 
       alpha--; 
       green = 0; 
      } 
      if (blue == NAN) { 
       alpha--; 
       blue = 0; 
      } 
      int rgb = ((alpha & 0xFF) << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF); 
      image.setRGB(x, y, rgb); 
      if (alpha < 3) { 
       finished = true; 
       break; 
      } 
     } 
     if (finished) break; 
    } 
    dis.close(); 
    ImageIO.write(image, "png", new File(imageFile)); 
} 

public static void imageToFile(String imageFile, String outputFile) throws IOException { 
    BufferedImage image = ImageIO.read(new File(imageFile)); 
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(outputFile)); 
    for (int y = 0; y < image.getHeight(); y++) { 
     boolean finished = false; 
     for (int x = 0; x < image.getWidth(); x++) { 
      int rgb = image.getRGB(x, y); 
      int alpha = (rgb >> 24) & 0xFF; 
      int red = (rgb >> 16) & 0xFF; 
      int green = (rgb >> 8) & 0xFF; 
      int blue = rgb & 0xFF; 
      if (alpha == 0) { 
       finished = true; 
       break; 
      } 
      if (alpha >= 1) dos.write(red); 
      if (alpha >= 2) dos.write(green); 
      if (alpha == 3) dos.write(blue); 
     } 
     if (finished) break; 
    } 
    dos.close(); 
} 
+2

「的任何文件」分割文件的大小,或者「任何形象」? –

+0

我想將任何文件(EXE,JAR等)轉換爲PNG。我也想把它轉換回來。 –

+1

什麼*確切*是問題?你不能弄清楚什麼? –

回答

2

我想你只是需要稍微調整內環。一個小的輔助方法,將使這件事情更容易使用,以爲我敢肯定,我的素描是醜了一點:

int myReadByte(DataInputStream dis) { 
    int b; 
    try { 
     b = dis.readByte(): 
    } catch (EOFException e) { 
     b = 0; 
    } 
    return b; 
} 
這個幫手

現在...

for (int x = 0; x < size; x++) { 
     int red = myReadByte(dis); 
     int green = myReadByte(dis); 
     int blue = myReadByte(dis); 
     int rgb = (0xFF << 24) | ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | (blue & 0xFF); 
     image.setRGB(x, y, rgb); 

for (int x = 0; x < image.getWidth(); x++) { 
     int rgb = image.getRGB(x, y); 
     int red = (rgb >> 16) & 0xFF; 
     int green = (rgb >> 8) & 0xFF; 
     int blue = rgb & 0xFF; 
     dos.write(red); 
     dos.write(green); 
     dos.write(blue); 
    } 
+0

也許在輸入輸出後調用DataInputStream時, - 拋出'EOFException' - 幫手可能需要更多的工作直到,我希望這個草圖很有用。 – sarnold

+0

我現在遇到的問題是這樣的: 例如,如果我把一個文本文件,內容如下使用_​​fileToImage_方法的PNG:_hello世界_ 然後我用_imageToFile_將其轉換回,輸出是:_hello world!SSSSSSSSSSSSSSSSS_(S代表「空間」,有15個) –

+0

哈!數字,我寫了一半的答案..你還需要提供一個標記,當你超出實際輸入,以便輸出例程知道何時忽略來自輸入的「噪聲」字節或剩餘的額外像素圖像矩形。你可以使用alpha通道(在這裏硬編碼爲'FF')來指示哪些字節包含有用的數據。這會更復雜一些,但值得努力修復。 – sarnold

0

看來你的代碼將連續的3個字節轉換爲一個像素。因爲你得到的文件只有1/3的顏色和2/3休息是空的。

要解決,僅僅在3

int size = ((int) Math.sqrt(dis.available()/3)) + 2; 
相關問題