2011-08-10 96 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