2011-08-10 182 views
1

我一直在嘗試使用從這裏樣品中灰色:
J2ME: Convert transparent PNG image to grayscale
這裏:
http://www.java2s.com/Code/Java/Collections-Data-Structure/intarraytobytearray.htm
轉換位圖圖像到黑莓J2ME

轉換的位圖圖像對象爲灰度飛但我遇到問題時,我想我的字節重新編碼到圖像和我碰到下面的錯誤/堆棧:

(Suspended (exception IllegalArgumentException))  
EncodedImage.createEncodedImage(byte[], int, int, String) line: 367 
EncodedImage.createEncodedImage(byte[], int, int) line: 279 
ScreenTemp.getGrayScaleImage(Bitmap) line: 404 

這裏是我的代碼我試圖:

Bitmap btemp = getGrayScaleImage(Bitmap.getBitmapResource("add.png")); 
    BitmapField bftemp = new BitmapField(btemp, BitmapField.FOCUSABLE | BitmapField.FIELD_HCENTER | BitmapField.FIELD_VCENTER); 
    add(bftemp); 


    public Bitmap getGrayScaleImage(Bitmap image) { 
    int width = image.getWidth(); 
    int height = image.getHeight();  
    int[] rgbData = new int[width * height];   
    image.getARGB(rgbData, 0, width, 0, 0, width, height); 
    for (int x = 0; x < width*height ; x++) { 
     rgbData[x] = getGrayScale(rgbData[x]); 
    } 
    byte[] b = int2byte(rgbData); 
    final EncodedImage jpegPic = EncodedImage.createEncodedImage(b, 0, b.length); 
    return jpegPic.getBitmap(); 
} 
private int getGrayScale(int c) { 
    int[] p = new int[4]; 
    p[0] = (int) ((c & 0xFF000000) >>> 24); // Opacity level 
    p[1] = (int) ((c & 0x00FF0000) >>> 16); // Red level 
    p[2] = (int) ((c & 0x0000FF00) >>> 8); // Green level 
    p[3] = (int) (c & 0x000000FF); // Blue level 

    int nc = p[1]/3 + p[2]/3 + p[3]/3; 
    // a little bit brighter 
    nc = nc/2 + 127; 

    p[1] = nc; 
    p[2] = nc; 
    p[3] = nc; 

    int gc = (p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]); 
    return gc; 
} 
private static byte[] int2byte(int[] src) { 
    int srcLength = src.length; 
    byte[]dst = new byte[srcLength << 2]; 

    for (int i=0; i<srcLength; i++) { 
     int x = src[i]; 
     int j = i << 2; 
     dst[j++] = (byte) ((x >>> 0) & 0xff);   
     dst[j++] = (byte) ((x >>> 8) & 0xff); 
     dst[j++] = (byte) ((x >>> 16) & 0xff); 
     dst[j++] = (byte) ((x >>> 24) & 0xff); 
    } 
    return dst; 
} 

任何幫助將是偉大的!

感謝, 賈斯汀

編輯: 得益於以下信息,我能夠解決這個問題。這是代碼。你不再需要int2byte這裏是更新的getGrayScaleImage方法:

public Bitmap getGrayScaleImage(Bitmap image) { 
    int width = image.getWidth(); 
    int height = image.getHeight();  
    int[] rgbData = new int[width * height];   
    image.getARGB(rgbData, 0, width, 0, 0, width, height); 
    for (int x = 0; x < width*height ; x++) { 
     rgbData[x] = getGrayScale(rgbData[x]); 
    } 
    byte[] b = int2byte(rgbData); 
    Bitmap bit = new Bitmap(width, height); 
    bit.setARGB(rgbData, 0, width, 0, 0, width, height); 
    return bit; 
} 

回答

4

EncodedImage javadoc報價:

如果圖像格式不承認,一個IllegalArgumentException被拋出。

你爲什麼擺弄EncodedImage?看來你應該能夠創建第二個位圖並使用setARGB()

+0

感謝這個工作! – Justin

2

擴展Scott W答案。

EncodedImage.createEncodedImage(byte[] data, int offset, int length)期望支持的圖像類型(TIFF,JPEG,BMP,GIF,WBMP或PNG)的字節數組。舉例來說,如果你開了一個JPEG圖像文件,讀取文件的字節,那麼將有可能使用GOT字節創建一個EncodedImage(這將是JPEGEncodedImage實際上)。

所以Scott W說你應該使用Bitmap.setARGB()爲結果字節數組有一個Bitmap轉換數據。

,然後如果你需要將圖像保存爲JPEG文件,你可以使用水木清華這樣的:

JPEGEncodedImage eImage = JPEGEncodedImage.encode(bitmap, 75); 
byte[] fileData = eImage.getData(); 
// open a FileConnection and write the fileData 
+0

感謝Scott和Arhimed的跟進,但數據類型是png文件格式,我只是試圖將每個像素轉換爲灰度。我會嘗試你的建議,看看我是否有幸運。 感謝您的快速回復! – Justin