0

画面に表示されているものからスクリーンショットを撮れるように、glReadPixels()を介してフレームバッファーから直接読み取ろうとしています。
私はGUIを使用していませんが、代わりに、画面に触れるたびに画面の生のコンテンツを印刷する必要があります(これは最初は十分です)。

gl.glReadPixels()関数の適切なコンテキストを取得するのに行き詰まっています。
私が今得ている文脈は、実際に画面に表示されているものとは何の関係もないと思うからです。

アプリケーションを実行すると、libEGLエラーが出力されます。

現在のコンテキストなしでOpenGLESAPIを呼び出す(スレッドごとに1回ログに記録される)

その後、配列をゼロで埋めます。

アプリケーションを非表示にするために、マニフェストで次の行を使用しています。

android:theme="@android:style/Theme.Translucent.NoTitleBar" 

そしてここにコードがあります:

public class ScreenshotActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {   
                savePixels();
        }
        return true;
    }


    EGL10 egl = (EGL10) EGLContext.getEGL();
    GL10 gl = (GL10) egl.eglGetCurrentContext().getGL();

    public void savePixels() {
         w= getWidth(this);
         h= getHeight(this);
         int b[] = new int[w * h];
         int bt[] = new int[w * h];
         IntBuffer ib = IntBuffer.wrap(b);
         ib.position(0);

         gl.glReadPixels(0, 0, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);


         for (int i = 0; i < h; i++) {
             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 - i - 1) * w + j] = pix1;
                 }
             }

             Log.w("debug", Arrays.toString(bt));
             moveTaskToBack(true);
    }
}

ヘルプは大歓迎です:)

4

3 に答える 3

1

スクリーンショットを撮るためにOpenGLを悪用しようとするのをやめてください。glReadPixels呼び出しを行ったプログラムのレンダリング出力をキャプチャする場合は問題ありませんが、他のプログラムが目的のピクセルソースになるとすぐに、信頼性が非常に低くなります。

フルスクリーンのスクリーンショットを撮る唯一の信頼できる方法は、GPUビデオバッファメモリから直接読み取ることです。AndroidはLinuxに基づいており、Linuxはこのためのfbdevデバイスを提供しています。これらすべてのioctlを操作するのは少し面倒なので、テスト済みのライブラリを使用する必要があります。スクリーンショットを撮るための専用APIを提供するAndroid用のライブラリがあります:http ://code.google.com/p/android-screenshot-library/wiki/DeveloperGuide

于 2013-03-27T10:44:18.947 に答える
0
mGLSurfaceView.queueEvent(new Runnable() {
  public void run() {
    savePixels();
  }
});

mGLSurfaceViewをSurfaceViewインスタンスに変更する必要があります。

于 2013-03-27T09:35:20.690 に答える
0

最後に、フレームバッファのキャプチャに/ dev / graphics/fb0を使用していないオープンソースプログラムを見つけました。

パッケージfb2pngには、CプログラムとPythonスクリプトが含まれており、どちらも完全に機能しています。

于 2013-04-19T12:28:24.050 に答える