2013-04-15 134 views
1

我需要爲Java中的圖像操作創建一個簡單的演示。我的代碼是基於swing的。我不必做任何複雜的事情,只是表明圖像以某種方式發生了變化。我將圖像讀作byte[]。無論如何,我可以在不破壞字節的情況下操作這個字節數組來顯示一些非常簡單的操作。我不希望使用paint()等。有什麼我可以直接到byte[]陣列來顯示一些變化?Java byte Image Manipulation

編輯:
我正在閱讀使用apache io庫的jpg圖像作爲byteArrayInputStream。字節被讀取好,我可以通過將它們寫回爲jpeg來確認它。

+1

它似乎你剛剛開始使用Java,我建議你從這裏http://www.herbschildt.com/whatsnew.htm參考Java Complete Reference,並特別閱讀圖像處理部分,你會發現你想要的東西 – Mihir

+0

你有什麼操作可以在'byt'上做e []'數組取決於它存儲的格式。RGB位圖? ARGB位圖? JPG? – Patashu

+0

@Patashu我的圖像從服務器下載爲base64字符串,然後使用Apache.commons庫中的Base64.decodeBase64()函數將它們轉換爲imageBytes。然後我使用fileoutputstream編寫它們,然後使用byteArrayInputStream在另一個函數中再次讀取。這些是需要改變的實際字節。 – user1900588

回答

1

您可以嘗試將RGB圖像轉換爲灰度。如果每像素3個字節的圖像呈現爲RedGreenBlue,則可以使用以下公式:y = 0.299 * r + 0.587 * g + 0.114 * b。

要清楚地遍歷字節數組並替換顏色。下面一個例子:

byte[] newImage = new byte[rgbImage.length]; 

    for (int i = 0; i < rgbImage.length; i += 3) { 
     newImage[i] = (byte) (rgbImage[i] * 0.299 + rgbImage[i + 1] * 0.587 
       + rgbImage[i + 2] * 0.114); 
     newImage[i+1] = newImage[i]; 
     newImage[i+2] = newImage[i]; 
    } 

UPDATE:

上面的代碼假設你正在使用的原始RGB圖像,如果你需要處理JPEG格式的文件,你可以這樣做:

 try { 
      BufferedImage inputImage = ImageIO.read(new File("input.jpg")); 

      BufferedImage outputImage = new BufferedImage(
        inputImage.getWidth(), inputImage.getHeight(), 
        BufferedImage.TYPE_INT_RGB); 
      for (int x = 0; x < inputImage.getWidth(); x++) { 
       for (int y = 0; y < inputImage.getHeight(); y++) { 
        int rgb = inputImage.getRGB(x, y); 
        int blue = 0x0000ff & rgb; 
        int green = 0x0000ff & (rgb >> 8); 
        int red = 0x0000ff & (rgb >> 16); 
        int lum = (int) (red * 0.299 + green * 0.587 + blue * 0.114); 
        outputImage 
          .setRGB(x, y, lum | (lum << 8) | (lum << 16)); 
       } 
      } 
      ImageIO.write(outputImage, "jpg", new File("output.jpg")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
+0

謝謝。我試過上面的代碼。但有兩件事:一個是arrayIndexoutofboundsexception,另一個是原生jpeg格式損壞。該索引可能是由於條件i user1900588

+0

如果您想使用jpeg文件,請參閱更新 – Alepac

+0

非常感謝。有效。公認。 – user1900588