Android Bitmap.getPixels неожиданные альфа-значения - PullRequest
1 голос
/ 15 февраля 2012

По разным причинам я реализую класс, который можно использовать аналогично растровому изображению в Android, сохраняя пиксельные данные для случаев, когда необходимо изменить размер действительного растрового изображения перед его передачей в OpenGL (степень размера 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) и связываю их, значения альфа неверны. Для полноты, вот как я связываю:

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 ]

1 голос
/ 28 февраля 2013

Пиксели, выходящие из растрового изображения Android, будут 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 );

В противном случае вам придется переставить то, что вы получили из растрового изображения, в RGBA, прежде чем вводить его в GL.

1 голос
/ 15 февраля 2012

Почему вы думаете, что альфа неверна?Я думаю, что только красные и синие компоненты поменялись местами.Это потому что Android Bitmap хранит пиксели в порядке RGBA, а OpenGL ES ожидает их в BGRA.Смотрите здесь: http://developer.android.com/reference/android/graphics/Color.html

Компоненты хранятся следующим образом (альфа << 24) |(красный << 16) |(зеленый << 8) |синий </p>

OpenGL ожидает цвет как (альфа << 24) |(синий << 16) |(зеленый << 8) |красный.Так что просто поменяйте местами синий и красный компоненты, и все будет в порядке. </p>

Альтернативным способом будет использование расширения GL_EXT_texture_format_BGRA888 для указания формата текстуры как GL_BGRA_EXT.

...