2013-05-18 14 views
5

In meiner Situation habe ich RenderSurfaceView nicht verwendet. Ich möchte eine Bildschirmaufnahme meiner Szene machen. Aber wenn ich den Screenshot speichern zeigt es Spiegelbild auf dem Kopf. Kann nicht verstehen, was ich hier falsch mache.Screen Capture in einer Engine ergibt das umgekehrte Spiegelbild

Hier ist mein Code

attachChild(screenCapture); 

        share_clicked = 1; 

        final int viewWidth = (int)camera.getWidth(); 
        final int viewHeight = (int)camera.getHeight(); 

        Log.d("camera width", "View width :" + viewWidth); 
        Log.d("camera height", "View height :" + viewHeight); 


        File direct = new File(
          Environment.getExternalStorageDirectory() 
            + "/Word"); 

        if (!direct.exists()) { 
         if (direct.mkdir()) 
          ; // directory is created; 

        } 

        screenCapture.capture(
          viewWidth, 
          viewHeight, 
          direct.getAbsolutePath() + "/word" 
            + System.currentTimeMillis() + ".png", 

          new IScreenCaptureCallback() { 

           public void onScreenCaptured(
             final String pFilePath) { 
            activity 
              .runOnUiThread(new Runnable() { 

               public void run() { 
                Toast.makeText(
                  activity, 
                  "Image Successfully saved to 'Word' folder in SD Card.", 
                  Toast.LENGTH_SHORT) 
                  .show(); 
               } 
              }); 

           } 

           public void onScreenCaptureFailed(
             final String pFilePath, 
             final Exception pException) { 


            activity.runOnUiThread(new Runnable() { 

               public void run() { 
                Toast.makeText(
                  activity, 
                  "Failed saving the image! Please check SD card.", 
                  Toast.LENGTH_SHORT) 
                  .show(); 
               } 
              }); 
           } 
          }); 

! [Dies ist der Screenshot i bekommt 1

Es wäre eine große Hilfe, wenn jemand dies für mich gesucht konnte aus. Danke.

Antwort

3

Update GLES2-AnchorCenter

AndEngine/src/org/AndEngine/entity/util/ScreenGrabber.java

private static Bitmap grab(final int pGrabX, final int pGrabY, final int pGrabWidth, final int pGrabHeight) { 
    final int[] pixelsRGBA_8888 = new int[pGrabWidth * pGrabHeight]; 
    final IntBuffer pixelsRGBA_8888_Buffer = IntBuffer.wrap(pixelsRGBA_8888); 

    // TODO Check availability of OpenGL and GLES20.GL_RGBA combinations that require less conversion operations. 
    GLES20.glReadPixels(pGrabX, pGrabY, pGrabWidth, pGrabHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixelsRGBA_8888_Buffer); 

    /* Convert from RGBA_8888 (Which is actually ABGR as the whole buffer seems to be inverted) --> ARGB_8888. */ 
    final int[] pixelsARGB_8888 = GLHelper.convertRGBA_8888toARGB_8888(pixelsRGBA_8888); 

    final int[] pixels = new int[pGrabWidth * pGrabHeight]; 

    for (int y = 0; y < pGrabHeight; y++) { 
     for (int x = 0; x < pGrabWidth; x++) { 
      pixels[x + ((pGrabHeight - y - 1) * pGrabWidth)] = pixelsARGB_8888[x + ((pGrabY + y) * pGrabWidth)]; 
     } 
    } 

    return Bitmap.createBitmap(pixels, pGrabWidth, pGrabHeight, Config.ARGB_8888); 
} 
+0

Dank für dieses Zeug. – Siddharth

+1

Tatsächlich gibt es einen Fehler, wenn pGrabY anders als 0 ist, gibt es eine ArrayOutOFBoundsException. Die Zeile sollte 'pixels [x + (pGrabHeight - y - 1) * pGrabWidth] = pixelsARGB_8888 [x + y * pGrabWidth];' ohne pGrabY im zweiten Teil des assign sein. – Orgmir