Android Bitmap.getPixels意外的alpha值

时间:2012-02-15 07:42:27

标签: android opengl-es opengl-es-2.0

出于各种原因,我正在实现一个类似于Android中的Bitmap的类,保存像素数据,以便在传递到OpenGL之前需要调整实际的Bitmap(2大小的功能)

我使用int []来保存像素数据,所以基本上,我的代码就像:

width2 = nearestPowerOf2(width);
height2 = nearestPowerOf2(height);
int[] pixels = new int[width2 * height2];
bitmap.getPixels(pixels, 0, width2, 0, 0, bitmap.getWidth(), bitmap.getHeight());

现在,退一步,如果我创建一个画布并使用canvas.draw()将较小的位图放到一个更大的,尺寸合适的图像上,然后将它绑定在OpenGL中,它就会完美地绘制。

但是,如果我拍摄像素数据(包裹在IntBuffer中)并绑定它,那么alpha值是错误的。为了完整起见,这就是我的约束力:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width2, height2, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixelsBuffer);

我不明白为什么会这样。

我检查了位图的格式,它们都是ARGB_8888。而且,再次,如果我直接绘制位图,或使用Bitmap.createBitmap(),它可以工作,但使用getPixels不行?

(之所以我不能使用Bitmap和Canvas,正如人们通常会使用的那样,如果我这样做,我们在某些设备上的本机用完了,显然,这对于释放本机内存非常懒惰是的,我正在使用Bitmap.recycle(),我将位图设置为null,我确保画布也设置为null。只有少数设备有问题,但足够我需要解决。)

This is the image rendered properly via a Bitmap This is the image rendered after using getPixels - please ignore the colors being strange as I understand why this is Here is a side by side, zoomed in for comparison

2 个答案:

答案 0 :(得分:1)

为什么你认为alpha不正确?我认为只交换红色和蓝色组件。这是因为android Bitmap以RGBA顺序存储像素,但OpenGL ES期望它们在BGRA中。见这里:http://developer.android.com/reference/android/graphics/Color.html

  

组件存储如下(α<24)| (红色&lt;&lt; 16)| (绿色&lt;&lt; 8)|蓝色

OpenGL期望颜色为(alpha <&lt; 24)| (蓝色&lt;&lt; 16)| (绿色&lt;&lt; 8)|红色。 所以只需交换蓝色和红色组件,你就可以了。

替代方法是使用GL_EXT_texture_format_BGRA888扩展名将纹理格式指定为GL_BGRA_EXT。

答案 1 :(得分:1)

如你所知,来自Android的Bitmap的像素将是ARGB,然后你将它们传递给glTexImage2D,它希望像素在RGBA中。我不确定OpenGL是否支持ARGB类型输入,否则您可以执行以下操作:

GLES20.glTexImage2D( GLES20.GL_TEXTURE_2D, 
                     0, 
                     GLES20.GL_RGBA, 
                     width2, 
                     height2, 
                     0, 
                     GLES20.GL_ARGB,            /** THIS ONE **/
                     GLES20.GL_UNSIGNED_BYTE, 
                     pixelsBuffer );

否则,在将其输入GL之前,您必须重新安排从Bitmap到RGBA的内容。