Скриншот Android OpenGL

Я много искал, как сделать снимок экрана моего объекта OpenGL на Android, и придумал это решение. Это сработало отлично, но в моем случае у меня есть вид с камеры и вид opengl (с прозрачным фоном) поверх вида с камеры. Итак, что я хочу сделать, это получить скриншот opengl с прозрачным фоном вместо черного. Как я уже сказал, я попробовал ссылку выше, и это сработало, но я застрял с черным фоном. Немного сложно понять, как избавиться от черного фона в данном конкретном случае. Надеюсь, кто-нибудь может помочь мне и как можно скорее, если это возможно (также я думаю, что решение простое, я просто упускаю что-то простое). Спасибо.


person Alex Bush    schedule 19.01.2011    source источник


Ответы (2)


Я использовал следующий метод и работал как чемпион.

public static Bitmap SavePixels(int x, int y, int w, int h, GL10 gl)
{  
     int b[]=new int[w*(y+h)];
     int bt[]=new int[w*h];
     IntBuffer ib=IntBuffer.wrap(b);
     ib.position(0);
     gl.glReadPixels(x, 0, w, y+h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);

     for(int i=0, k=0; i<h; i++, k++)
     {//remember, that OpenGL bitmap is incompatible with Android bitmap
      //and so, some correction need.        
          for(int j=0; j<w; j++)
          {
               int pix=b[i*w+j];
               int pb=(pix>>16)&0xff;
               int pr=(pix<<16)&0x00ff0000;
               int pix1=(pix&0xff00ff00) | pr | pb;
               bt[(h-k-1)*w+j]=pix1;
          }
     }


     Bitmap sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);
     return sb;
}

Вам просто нужно позвонить

YourClass.SavePixels(0,0,width,height,gl);

Я надеюсь, что это сработает для вас...

Спасибо, Мидхун.

person Midhere    schedule 16.02.2011
comment
Выглядит многообещающе! Извините, был очень занят... скоро проверю. - person Alex Bush; 25.02.2011
comment
@Midhere... снимок черного экрана. - person Noman; 16.12.2011
comment
@Midhere Как вы инициализируете gl? - person XXX; 10.03.2013
comment
Вы должны инициализировать gl, используя GLSurfaceView и реализовав обратный вызов рендеринга. GLSurfaceview будет отображать/отрисовывать вашу 3D-графику, и вам необходимо написать код отрисовки графики в методе onDrawFrame(GL10 gl). Поэтому savepixels следует вызывать после отрисовки всех графических компонентов. Если вы этого не сделаете, вы увидите черный экран. - person Midhere; 19.03.2013
comment
Не могли бы вы предоставить мне полный код для этого, я не знаю об open GL.... :( - person Anuj Sharma; 12.06.2013
comment
Для версии, которая не требует байтовой копии, см. saveFrame() в классе Grafika EglSurfaceBase (github.com/google/grafika/blob/master/src/com/android/grafika/). - person fadden; 07.01.2015
comment
как получить гл в этом? - person Rohit Goyal; 22.02.2016
comment
Функция должна работать в потоке Open GL — проверьте здесь заголовок stackoverflow.com/questions/5234867/ - person CanonicalBear; 27.11.2020

Упомянутое вами решение использует Bitmap.Config.RGB_565, который не поддерживает альфа-каналы.

Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

Вместо этого вы должны использовать Bitmap.Config.ARGB_8888 или Bitmap.Config.ARGB_4444.

person Will Kru    schedule 21.01.2011
comment
Спасибо. Я попытался использовать ARGB_4444, и я получил изображение с перепутанными цветами (я думаю, что что-то сместилось, и оно имеет забавный вид из множества разных цветов). Я думаю, что мне нужно изменить алгоритм преобразования пикселей в rgb. Когда я попробовал 8888, я получил ошибку о размере растрового изображения. Как мне изменить размер? - person Alex Bush; 26.01.2011
comment
ARGB_4444 «искажает» ваши цвета, потому что использует половину места для сохранения той же информации. В то время как RGB_8888 использует 8 бит для каждого канала (R, G, B и альфа-канал), RGB_4444 использует 4 бита для каждого канала, что усекает информацию и дает очень плохое воспринимаемое качество. Наиболее заметными эффектами являются полосатость и искажение цвета. Некоторые методы сглаживания пытаются решить эту проблему, но я не знаю, доступны ли они изначально в Android. Если 8888 выдает ошибку памяти, попробуйте уменьшить размер растрового изображения. Возможно, на вашем устройстве недостаточно оперативной памяти. - person RedOrav; 04.01.2013
comment
Даже при использовании Bitmap.Config.ARGB_8888 дает черный фон. - person pallavi; 04.05.2015
comment
Функция должна работать в потоке Open GL: stackoverflow.com/questions/5234867/ - person CanonicalBear; 27.11.2020