2015-12-31 3 views
0

Я делаю следующее, чтобы получить растровое изображение, которое было установлено на GLSurfaceView объекта:Как получить растровое изображение из GLSurfaceView

glView.setDrawingCacheEnabled(true); 
glView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
     View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
glView.layout(0, 0, glView.getMeasuredWidth(), glView.getMeasuredHeight()); 

glView.buildDrawingCache(true); 
Bitmap tmpbm = Bitmap.createBitmap(glView.getDrawingCache()); 
glView.setDrawingCacheEnabled(false); 

Но glView.getDrawingCache() возвращается мне null в вышеуказанном случае, и поэтому он сбой в строке Bitmap tmpbm = Bitmap.createBitmap(glView.getDrawingCache()); Почему я получаю null оттуда и как мне решить эту проблему? Кроме того, есть ли другой/лучший способ достичь моей цели? Любая помощь будет высоко оценен.

+0

См http://stackoverflow.com/questions/27817577/android-take-screenshot-of-surface-view-shows-black-screen , Код в ответе от @Helmi должен работать до тех пор, пока вы вызываете его из 'onDrawFrame()'. – fadden

ответ

0

Попробуйте этот метод: более

private Bitmap createBitmapFromGLSurface(int x, int y, int w, int h, GL10 gl) 
     throws OutOfMemoryError { 
    int bitmapBuffer[] = new int[w * h]; 
    int bitmapSource[] = new int[w * h]; 
    IntBuffer intBuffer = IntBuffer.wrap(bitmapBuffer); 
    intBuffer.position(0); 

    try { 
     gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, intBuffer); 
     int offset1, offset2; 
     for (int i = 0; i < h; i++) { 
      offset1 = i * w; 
      offset2 = (h - i - 1) * w; 
      for (int j = 0; j < w; j++) { 
       int texturePixel = bitmapBuffer[offset1 + j]; 
       int blue = (texturePixel >> 16) & 0xff; 
       int red = (texturePixel << 16) & 0x00ff0000; 
       int pixel = (texturePixel & 0xff00ff00) | red | blue; 
       bitmapSource[offset2 + j] = pixel; 
      } 
     } 
    } catch (GLException e) { 
     return null; 
    } 

    return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888); 
} 

here

+0

Можете ли вы рассказать мне, что мне следует передавать в качестве параметров функции 'private Bitmap createBitmapFromGLSurface (int x, int y, int w, int h, GL10 gl)'? 'gl' Я получаю от самой функции' onDrawFrame'. Аналогично, у меня есть значения для 'w' и' h' (ширина и высота изображения). Но какими должны быть значения 'x' и' y'? –

+0

x & y представляет точку начала при чтении пикселей. вы можете использовать 0 для обоих, если хотите получить всю поверхность. в противном случае используйте ту часть, которая вам нужна. – Helmi

Смежные вопросы