2017-07-08 3 views
0

Ich versuche, eine Bitmap in einem ImageView anzuzeigen. Mit der Camera2-API erhalte ich eine ImageReader über die ImageReader.OnImageAvailableListener. Ich erstelle dann eine Bitmap aus dem Bild:Bitmap ist nicht richtig Größe und Ausrichtung

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new 
     ImageReader.OnImageAvailableListener() { 
      @Override 
      public void onImageAvailable(ImageReader reader) { 
       mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage())); 
      } 
     }; 
private class ImageSaver implements Runnable { 

    private final Image mImage; 

    public ImageSaver(Image image) { 
     mImage = image; 
    } 

    @Override 
    public void run() { 
     ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer(); 
     byte[] bytes = new byte[byteBuffer.remaining()]; 
     byteBuffer.get(bytes); 
     // need to set the bitmap the size of the screen 
     final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       imageView.setImageBitmap(bitmap); 
      } 
     }); 

Wie Sie aus dem Screenshot sagen können, wird das Bitmap nicht den ganzen Bildschirm ausfüllen und es ist in der Landschaft eher als Hochformat. Mein ImageView sieht so aus:

<ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/imageView" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" /> 

Und seine Eltern ist die RelativeLayout, die den gesamten Bildschirm füllt. Was mache ich falsch?

enter image description here

+0

Dies könnte helfen: https://stackoverflow.com/questions/9015372/how-to-rotate-a-bitmap-90-degrees – Barns

Antwort

0

die Android-Matrix-Klasse in meiner Situation geholfen Verwendung:

   ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer(); 
       byte[] bytes = new byte[byteBuffer.remaining()]; 
       byteBuffer.get(bytes); 
       final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 

       Matrix matrix = new Matrix(); 
       matrix.postRotate(90); 
       Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap,mImage.getWidth(),mImage.getHeight(),true); 
       Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap , 0, 0, scaledBitmap .getWidth(), scaledBitmap .getHeight(), matrix, true); 

Kann mir jemand raten, ob dies eine gute Lösung oder kann dieser Code Refactoring?

Verwandte Themen