2016-11-14 2 views
0

Ich konvertiere jeden von der Kamera abgerufenen Frame in eine Bitmap und zeige sie auf einem ImageView an. Was ich haben will, ist die genaue Größe der Bitmap, die auf dem Bild angezeigt wird, NICHT die Größe des ImageView selbst. in dem unten angegebenen Code ist meine Versuche und wie ich versuchte, die Breite und die Höhe der Bitmap zu bekommen. Aber der Code darunter geschrieben scheint es gibt nur die Dimensionen des Imageview selbst, weil ich den Code zweimal getestet wie folgt:Wie bekomme ich die Größe von Bitmap, das ein imageView belegt?

Erster Test:

stelle ich die layout_weight Attribut auf 0,3 wie folgt

<RelativeLayout 
    android:id="@+id/mainActivity_imageView_container" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight=".3" 
    android:layout_below="@id/mainActivity_cameraPreview_container"> 

    <ImageView 
     android:id="@+id/mainActivity_ivEdges" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</RelativeLayout> 

und zur Laufzeit empfangen i die folgende Ausgabe:

11-14 14:16:16.782 585-681/com.example.textureview_03 D/PreviewSurface: before bitmap.getWidth(): 960 
11-14 14:16:16.782 585-681/com.example.textureview_03 D/PreviewSurface: before bitmap.getHeight(): 720 
11-14 14:16:16.907 585-585/com.example.textureview_03 D/PreviewSurface: after resizedBitmap.getWidth(): 720 
11-14 14:16:16.907 585-585/com.example.textureview_03 D/PreviewSurface: after resizedBitmap.getHeight(): 960 

Bild wird angezeigt

enter image description here

Zweiten Test:

i das layout_weight Attribut auf 0,6 eingestellt, wie

<RelativeLayout 
    android:id="@+id/mainActivity_imageView_container" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight=".6" 
    android:layout_below="@id/mainActivity_cameraPreview_container"> 

    <ImageView 
     android:id="@+id/mainActivity_ivEdges" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</RelativeLayout> 

und zur Laufzeit folgt empfangen i die folgende Ausgabe:

11-14 14:17:33.577 2241-2339/com.example.textureview_03 D/PreviewSurface: before bitmap.getWidth(): 960 
11-14 14:17:33.577 2241-2339/com.example.textureview_03 D/PreviewSurface: before bitmap.getHeight(): 720 
11-14 14:17:33.667 2241-2241/com.example.textureview_03 D/PreviewSurface: after resizedBitmap.getWidth(): 720 
11-14 14:17:33.667 2241-2241/com.example.textureview_03 D/PreviewSurface: after resizedBitmap.getHeight(): 960 

Bild

enter image description here

i geschlossen Daher angezeigt wird, dass die Größe i in dem logcat Ausgang immer bin, ist nicht die genaue Größe der Bitmap wird auf dem Imageview angezeigt, aber es könnte die Größe des ImageView selbst

Bitte lassen Sie mich wissen, wie Sie die genaue Größe der Bitmap erhalten, die auf dem ImageView angezeigt wird?
Code:

@Override 
    protected Void doInBackground(Void... params) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     int format = parameters.getPreviewFormat(); 
     //YUV formats require more conversion 
     if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) { 
      int w = parameters.getPreviewSize().width; 
      int h = parameters.getPreviewSize().height; 
      // Get the YuV image 
      YuvImage yuv_image = new YuvImage(mData, format, w, h, null); 
      Rect rect = new Rect(0, 0, w, h); 
      ByteArrayOutputStream output_stream = new ByteArrayOutputStream(); 
      yuv_image.compressToJpeg(rect, 100, output_stream); 
      byte[] byt = output_stream.toByteArray(); 

      Bitmap bitmap = BitmapFactory.decodeByteArray(byt, 0, byt.length); 
      Log.d(TAG, "before bitmap.getWidth(): " + bitmap.getWidth()); 
      Log.d(TAG, "before bitmap.getHeight(): " + bitmap.getHeight()); 

      //required to rotate the bitmap, because it is initially lopsided 
      Matrix matrix = new Matrix(); 
      matrix.postRotate(90); 
      Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

      publishProgress(resizedBitmap); 
     } 

    @Override 
    protected void onProgressUpdate(Bitmap... values) { 
     super.onProgressUpdate(values); 

     Bitmap resizedBitmap = values[0]; 
     Log.d(TAG, "after resizedBitmap.getWidth(): " + resizedBitmap.getWidth()); 
     Log.d(TAG, "after resizedBitmap.getHeight(): " + resizedBitmap.getHeight()); 

     mIVEdges.setImageBitmap(resizedBitmap); 
    } 
+0

Verwendung 'layout_width' &' 'layout_weight' wrap_content' und versuchen –

+1

@kirankumar ich habe versucht it..i bin die gleiche Größe bekommen egal was das Layoutgewicht ist !!! – user2121

Antwort

0

Vielleicht Linie,

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

macht für Sie Problem. Machen Sie die Rotationsmatrix um 90 Grad ist ok, aber die Breite für resizedBitmap ist nicht mehr breit. Versuchen Sie folgendes:

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getHeight() , bitmap.getWidth() , matrix, true); 

hoffe, dass ich diese Ihnen helfen

Verwandte Themen