сохранение 2d текстуры - повреждены данные пикселей - PullRequest
0 голосов
/ 05 февраля 2020

Я рисую текстуру в opengl, а затем сохраняю текстуру в файл.
Когда я рисую текстуру на экране, все в порядке, но когда я сохраняю ее, она идет не так.

Вот код:

public Bitmap toBitmap() {
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(width * height * 4);
    GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(byteBuffer);
    return bitmap;
}

public void savePngToSd(Bitmap bmp, String fileName) {
    BufferedOutputStream bos = null;
    try {
        bos = new BufferedOutputStream(new FileOutputStream(fileName));
        bmp.compress(Bitmap.CompressFormat.PNG, 100, bos);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (bos != null) {
            try {
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Когда я рисую изображение с фоном, оно прекрасно его сохраняет, проблема появляется только при отсутствии фона.

Сохраняется с зеленым фоном : good image with green background

Сохранено без фона: bad image without background

Вы можете видеть, что некоторые пиксели, которые были только наполовину видимыми, стали черными. Как правильно сохранить изображение, даже без фона?

ОБНОВЛЕНИЕ:
Я обнаружил, что могу использовать растровое изображение, чтобы получить из него ByteBuffer, а затем использовать его для создания текстуры opengl это работает, поэтому проблема должна быть связана со сжатием растрового изображения.

Я нашел статью, которая может объяснить эту проблему https://pspdfkit.com/blog/2016/a-curious-case-of-android-alpha/

...