0

Ich bin zu einer benutzerdefinierten Kamera zu binden und nach dem Fotografieren stelle ich es in der Bildansicht in der gleichen Aktivität wie in der ich Kamera einstellen. Ich habe die Fotos erfolgreich aufgenommen, aber bevor ich das Bild in die Bildansicht einstelle, muss ich es skalieren, was die Bildqualität verringert. Gibt es eine Möglichkeit, das reale Bild zu zeigen, anstatt es zu skalieren?Skalierung des Bildes und der Einstellung in der Bildansicht reduziert die Bildqualität und quetscht es

Meine Bilder sind wie unten Zuerst eine reale Ansicht der Kamera ist, die Oberflächenansicht ist: This is the real view of camera

Nach Foto Taking es wird:

The real camera image

Der Code Ich bin Verwenden ist:

Camera.PictureCallback picture = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      mCamera.stopPreview(); 
      surface_view.setVisibility(View.INVISIBLE); 
      setupImageDisplay(data); 

     } 
    }; 

    private void setupImageDisplay(byte[] data) { 
     photo = BitmapFactory.decodeByteArray(data, 0, data.length); 
     photo = scaleDown(photo, true);//scaling down bitmap 
     imageview_photo.setImageBitmap(photo); //setting bitmap in imageview 

    } 

    public Bitmap scaleDown(Bitmap realImage, boolean filter) { 
     int screenWidth = width; 
     int screenHeight = height; 

     Bitmap scaled; 
     if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
      // Notice that width and height are reversed 
      scaled = Bitmap.createScaledBitmap(realImage, screenHeight, screenWidth, filter); 
      int w = scaled.getWidth(); 
      int h = scaled.getHeight(); 
      // Setting post rotate to 90 

      Matrix mtx = new Matrix(); 

      if (camera_id == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       float[] mirrorY = {-1, 0, 0, 0, 1, 0, 0, 0, 1}; 
       Matrix matrixMirrorY = new Matrix(); 
       matrixMirrorY.setValues(mirrorY); 

       mtx.postConcat(matrixMirrorY); 
      } 
      mtx.postRotate(90); 
      // Rotating Bitmap 
      realImage = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, filter); 
     } else {// LANDSCAPE MODE 
      //No need to reverse width and height 
      scaled = Bitmap.createScaledBitmap(realImage, screenHeight, screenWidth, filter); 
      int w = scaled.getWidth(); 
      int h = scaled.getHeight(); 
      // Setting post rotate to 90 

      Matrix mtx = new Matrix(); 

      if (camera_id == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
       float[] mirrorY = {-1, 0, 0, 0, 1, 0, 0, 0, 1}; 
       Matrix matrixMirrorY = new Matrix(); 
       matrixMirrorY.setValues(mirrorY); 

       mtx.postConcat(matrixMirrorY); 
      } 
      mtx.postRotate(180); 
      // Rotating Bitmap 
      realImage = Bitmap.createBitmap(scaled, 0, 0, w, h, mtx, filter); 
     } 
     return realImage; 
    } 

Nach dem Fotografieren ist das Bild wie gequetscht. Gibt es irgendein Bild, das nach der Skalierung gleich bleibt?

+0

Versuchen Glide Bibliothek zu verwenden, wird es Ihre Bilder automatisch skaliert. –

+0

@MaximeLiege aber im glide musst du nicht die url des bildes angeben? In diesem Fall benutze ich einfache Bitmap – SimpleMan

+0

Nein, Sie können es auch Drawables geben –

Antwort

0

Sie können eine separate Datei erstellen, bei der es sich um eine temporäre Datei handelt, und die Miniaturgröße des Bildes speichern. Sie können ein POJO so erstellen, dass beide Bilder gespeichert werden. Sie können den kleineren anzeigen und die Originaldatei verwenden, um eine hohe Qualität zu erhalten.

public class Image { 
File fullSize; 
File Thumbnail; 

public Image(File fullSize, File thumbnail) { 
    this.fullSize = fullSize; 
    Thumbnail = thumbnail; 
} 

public File getFullSize() { 
    return fullSize; 
} 

public void setFullSize(File fullSize) { 
    this.fullSize = fullSize; 
} 

public File getThumbnail() { 
    return Thumbnail; 
} 

public void setThumbnail(File thumbnail) { 
    Thumbnail = thumbnail; 
} 

}

+0

Sollte ich die Datei des Bildes in der Anwendung speichern? – SimpleMan

+0

Verwenden Sie die Berechtigung, um auf den Dateispeicher des Telefons zuzugreifen. Und speichern Sie die Dateien dort, Sie sollten auch den Pfad des Bildes speichern. –

+0

aber ich möchte das Bild nirgendwo im Telefon speichern ist das möglich mit diesem? – SimpleMan

Verwandte Themen