GLSurfaceView의 캡쳐에 대해서

조회수 863회

실시간으로 그려진 GLSurfaceView의 터치에서 50-50 떨어진 지역의 스크린 샷을 찍고 싶습니다.

정확히 말하면 터치 한 영역의 좌표가 X = 50, Y = 50 인 경우 크기가 (X-50, Y-50), (X + 50, Y + 50) 인 사각형 내부 영역을 캡처하고 싶습니다.

@Override
    public void onDrawFrame(GL10 unused)
    {
        render();

        if (!mInitialized) {
            // Only need to do this once
            mEffectContext = EffectContext.createWithCurrentGlContext();
            mInitialized = true;
        }
        if (saveFrame) {
            saveBitmap(takeScreenshot(unused));
//            saveFrame = false;
        }
    }

    private void saveBitmap(Bitmap bitmap) {
        try {
            File f = new File(Environment.getExternalStorageDirectory(), "zoom.png");
            f.createNewFile();
            OutputStream outputStream = new FileOutputStream(f);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
            outputStream.close();

            DispChar.mimg_char_1_1.setImageBitmap(bitmap);

            Log.i("TAG", "SAVED");
        } catch (Exception e) {
            Log.e("TAG", e.toString(), e);
        }
    }

    public Bitmap takeScreenshot(GL10 mGL) {
        final int mWidth = RadarMainActivity.mGLSurfaceView.getWidth();
        final int mHeight = RadarMainActivity.mGLSurfaceView.getHeight();
        IntBuffer ib = IntBuffer.allocate(mWidth * mHeight);
        IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight);
        mGL.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);
        // Convert upside down mirror-reversed image to right-side up normal image.
        for (int i = 0; i < mHeight; i++) {
            for (int j = 0; j < mWidth; j++) {
                ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i * mWidth + j));
            }
        }

        glSurfaceBitmap = Bitmap.createBitmap(mWidth, mHeight ,Bitmap.Config.ARGB_8888);
        glSurfaceBitmap.copyPixelsFromBuffer(ibt);
        return glSurfaceBitmap;
    }

현재 이러한 방법으로 캡처 중입니다. 특정 부분 만 캡처되도록 하려면 어떤 부분을 수정해야하는건가요?

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • `glReadPixels()` 의 x,y 파라미터가 프레임 버퍼에서 시작점을 의미하는게 아닐까요? 알 수 없는 사용자 2019.8.8 12:51
  • 그래서 바꿔봣는데 화면의 크기를 얘기하는 것 같더라구요... 알 수 없는 사용자 2019.8.8 12:56
  • glReadPixels() 에 mWidth, mHeight 값이 커서 그런건 아닌가요? 코드만 보자면 SurfaceView 크기 그대로 bitmap 을 가져올것 같습니다만.. 알 수 없는 사용자 2019.8.8 13:07
  • 네 현재 코드상에서는 크기 그대로 저장해요, 문제는 저길 좌표값을 읽어다가 수정해도 이게 지금 제대로 작동한건지 구분이 안갈정도로 이상하게 스샷이 찍히는데 뭐로 설명을 못드리겠네요 ㅠ 알 수 없는 사용자 2019.8.8 13:18
  • 만약 Pis님이 말씀하신대로 glReadPixels에서 변경하면 된다고 했을 때, 위 조건대로라면 어떤식으로 해야하나요? 현재 클릭한곳의 좌표는 idX, idY라는 놈이 가지고 있는데... 여러가지 해봣는데. 전부 이상하게 찍히네요 ㅠ 알 수 없는 사용자 2019.8.8 14:27
  • 제가 openGL 은 잘 몰라서.. 혹시 이 링크가 참고가 될지 모르겠네요 https://m.blog.naver.com/PostView.nhn?blogId=pkk1113&logNo=221128661359&proxyReferer=https%3A%2F%2Fwww.google.com%2F 알 수 없는 사용자 2019.8.8 18:37

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)