Как часть моего приложения, мне нужно конвертировать из RGBA в формат IYUV.
Я использую openGL ES для вызова glReadPixels (), который позже загружается в байтовый буфер с помощью вызова glMapBufferRange (). Я был в состоянии надежно считывать пиксели с экрана и сохранять данные в виде изображения. glReadPixels () возвращает данные только в формате RGBA.
Следующим шагом является подача этих данных в кодер h.264 для сжатия. Кодер h.264 (я полагаю) потребляет данные в формате IYUV.
Так что я ищу способ преобразования из цветового пространства RGBA в IYUV. Я относительно новичок в обработке изображений, поэтому я все еще изучаю многое. Любое движение в правильном направлении будет с благодарностью!
Я уже рассмотрел многие из собственных утилит преобразования цветового пространства Android, и ни одна из них не охватывает этот конкретный случай. Похоже, Android изначально поддерживает только несколько разновидностей YUV, и IYUV не входит в их число.
Этот код считывает данные с экрана через glReadPixelsPBO ()
//generate and bind buffer ID
GLES30.glGenBuffers(1, pboIds);
checkGlError("Gen Buffers");
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, pboIds.get(0));
checkGlError("Bind Buffers");
//creates and initializes data store for PBO. Any pre-existing data store is deleted
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, (mWidth * mHeight * 4), null, GLES30.GL_STATIC_READ);
checkGlError("Buffer Data");
glReadPixelsPBO(0, 0, mWidth, mHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0);
checkGlError("Read Pixels");
Этот код загружает пиксели в ByteBuffer
//read pixels from PBO into a byte buffer for processing. Unmap buffer for use in next pass
mapBuffer = ((ByteBuffer) GLES30.glMapBufferRange(GLES30.GL_PIXEL_PACK_BUFFER, 0, 4 * mWidth * mHeight, GLES30.GL_MAP_READ_BIT)).order(ByteOrder.nativeOrder());
checkGlError("Map Buffer");
byte[] mBuffer;
//ByteBuffer.get(destination) will dump bytes into byte array, then probs easier to print out in human readable
Log.d(TAG, "Mapped Buffer Contents: \n");
GLES30.glUnmapBuffer(GLES30.GL_PIXEL_PACK_BUFFER);
checkGlError("Unmap Buffer");
convertColorSpace(mapBuffer);