Я много искал, как сделать снимок экрана моего объекта OpenGL на Android, и придумал это решение. Это сработало отлично, но в моем случае у меня есть вид с камеры и вид opengl (с прозрачным фоном) поверх вида с камеры. Итак, что я хочу сделать, это получить скриншот opengl с прозрачным фоном вместо черного. Как я уже сказал, я попробовал ссылку выше, и это сработало, но я застрял с черным фоном. Немного сложно понять, как избавиться от черного фона в данном конкретном случае. Надеюсь, кто-нибудь может помочь мне и как можно скорее, если это возможно (также я думаю, что решение простое, я просто упускаю что-то простое). Спасибо.
Скриншот Android OpenGL
Ответы (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
Выглядит многообещающе! Извините, был очень занят... скоро проверю.
- person Alex Bush; 25.02.2011
@Midhere... снимок черного экрана.
- person Noman; 16.12.2011
@Midhere Как вы инициализируете gl?
- person XXX; 10.03.2013
Вы должны инициализировать gl, используя GLSurfaceView и реализовав обратный вызов рендеринга. GLSurfaceview будет отображать/отрисовывать вашу 3D-графику, и вам необходимо написать код отрисовки графики в методе onDrawFrame(GL10 gl). Поэтому savepixels следует вызывать после отрисовки всех графических компонентов. Если вы этого не сделаете, вы увидите черный экран.
- person Midhere; 19.03.2013
Не могли бы вы предоставить мне полный код для этого, я не знаю об open GL.... :(
- person Anuj Sharma; 12.06.2013
Для версии, которая не требует байтовой копии, см.
saveFrame()
в классе Grafika EglSurfaceBase (github.com/google/grafika/blob/master/src/com/android/grafika/).
- person fadden; 07.01.2015
как получить гл в этом?
- person Rohit Goyal; 22.02.2016
Функция должна работать в потоке 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
Спасибо. Я попытался использовать ARGB_4444, и я получил изображение с перепутанными цветами (я думаю, что что-то сместилось, и оно имеет забавный вид из множества разных цветов). Я думаю, что мне нужно изменить алгоритм преобразования пикселей в rgb. Когда я попробовал 8888, я получил ошибку о размере растрового изображения. Как мне изменить размер?
- person Alex Bush; 26.01.2011
ARGB_4444 «искажает» ваши цвета, потому что использует половину места для сохранения той же информации. В то время как RGB_8888 использует 8 бит для каждого канала (R, G, B и альфа-канал), RGB_4444 использует 4 бита для каждого канала, что усекает информацию и дает очень плохое воспринимаемое качество. Наиболее заметными эффектами являются полосатость и искажение цвета. Некоторые методы сглаживания пытаются решить эту проблему, но я не знаю, доступны ли они изначально в Android. Если 8888 выдает ошибку памяти, попробуйте уменьшить размер растрового изображения. Возможно, на вашем устройстве недостаточно оперативной памяти.
- person RedOrav; 04.01.2013
Даже при использовании Bitmap.Config.ARGB_8888 дает черный фон.
- person pallavi; 04.05.2015
Функция должна работать в потоке Open GL: stackoverflow.com/questions/5234867/
- person CanonicalBear; 27.11.2020