0

Ich habe eine App mit dem folgenden LayoutAndroid: Unter Screenshot aller Ansichten auf dem Display

  • SurfaceHolder
  • Surface
  • CameraPreview
  • Ansicht (dumme Gläser)

Alle Ich möchte ein Foto/Schnappschuss von diesem machen und es betrachten, scheinen bonkers/Komplex

Ich habe zuerst einen Schnappschuss von der Oberfläche gemacht und ein schwarzes Quadrat bekommen, es scheint, dass diese Methode falsch ist

Jetzt verwende ich MediaProjection/ImageReader?

Update: So bekomme ich ein Bild aber von Wellenlinien und es stürzt ab, weil ich versuche, die MediaProjection zu stoppen. Wie gesagt alles, was ich tun möchte, ist ein einzelnes Bild nehmen

private void saveImage() 
    { 
     final Handler mHandler = new Handler(); 

     final ImageReader mImageReader = ImageReader.newInstance(cameraSurface.getWidth(), cameraSurface.getHeight(), PixelFormat.RGBA_8888, 2); 
     mProjection.createVirtualDisplay("screen-mirror", cameraSurface.getWidth(), cameraSurface.getHeight(), mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mImageReader.getSurface(), null, null); 

     mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader reader) { 
       Image image = null; 
       FileOutputStream fos = null; 
       Bitmap bitmap = null; 

       try { 
        image = mImageReader.acquireLatestImage(); 
        fos = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "/myscreen.jpg"); 
        final Image.Plane[] planes = image.getPlanes(); 
        final Buffer buffer = planes[0].getBuffer().rewind(); 
        bitmap = Bitmap.createBitmap(cameraSurface.getWidth(), cameraSurface.getHeight(), Bitmap.Config.ARGB_8888); 
        bitmap.copyPixelsFromBuffer(buffer); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); 

        //MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Title" , "Desc"); 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if (fos!=null) { 
         try { 
          fos.close(); 
         } catch (IOException ioe) { 
          ioe.printStackTrace(); 
         } 
        } 

        if (bitmap!=null) 
         bitmap.recycle(); 

        if (image!=null) 
         image.close(); 

        if (mProjection!=null) { 
         mProjection.stop(); 
         mImageReader.close(); 

        } 
       } 
      } 

     }, mHandler); 
    } 

Antwort

2

Sie Ihre Imagereader für ImageFormat.RGB_565 konfigurieren, welches Format 0x4 ist. Die virtuelle Anzeige gibt Frames im Format 0x1, PixelFormat.RGBA_8888 zurück. (Ja, es gibt zwei überlappende Definitionen des Farbformats.) Die Konfigurationen stimmen nicht überein, daher der Fehler.

Ändern Sie Ihre ImageReader-Erstellungszeile, um stattdessen das RGBA_8888-Format zu verwenden.

Sie werden ein anderes Problem haben, wenn Sie versuchen, die Bitmap zu erstellen. decodeByteArray() ist für komprimierte Daten wie PNG oder JPEG gedacht. Es wird nicht wissen, wie rohe Pixeldaten zu interpretieren sind. Verwenden Sie stattdessen einen Anruf wie Bitmap#createBitmap() und übergeben Sie ARGB_8888 im Parameter Bitmap.Config.

(Für weitere allgemeine Kommentare siehe this answer.)