2014-06-24 13 views
6

99,9% di tutte le risposte a una domanda nel titolo sono i seguenti:Come scattare una foto con le stesse proporzioni della dimensione dell'anteprima?

Quando si ricerca attraverso il List<Camera.Size>, fornito da Camera.Parameters#getSupportedPictureSizes() cercare di trovare la dimensione della stesse proporzioni della fotocamera formato anteprima che si imposta via Camera.Parameters.html#setPreviewSize(int,int), o il più vicino possibile.

Va bene, ma cosa succede se non riesco a trovare la dimensione dell'immagine del lo stesso rapporto aspetto come in formato anteprima (Android ti dà alcuna garanzia che per ogni dimensione anteprima supportato dalla fotocamera c'è una foto dimensioni dello stesso formato) e tutte le altre dimensioni di immagine (che sono il più vicino possibile) allungare la mia foto come nelle domande this e this? Come posso realizzare una foto delle proporzioni esattamente identiche a quelle dell'anteprima, anche se le dimensioni dell'immagine e le dimensioni dell'anteprima impostate in Camera.Parameters hanno proporzioni diverse?

risposta

10

Possiamo conoscere l'approccio generale a questo problema in this answer. Breve citazione:

La mia soluzione era di ridimensionare in primo luogo il rettangolo di selezione dell'anteprima alla dimensione dell'immagine nativa della telecamera. Quindi, ora che so quale area della risoluzione nativa contiene il contenuto che voglio, posso eseguire un'operazione simile per ridimensionare quel rettangolo sulla risoluzione nativa per l'immagine più piccola che è stata effettivamente catturata per Camera.Parameters.setPictureSize.

Ora, al codice effettivo. Il modo più semplice per eseguire il ridimensionamento è utilizzare Matrix. Ha il metodo Matrix#setRectToRect(android.graphics.RectF, android.graphics.RectF, android.graphics.Matrix.ScaleToFit) che possiamo usare in questo modo:

// Here previewRect is a rectangle which holds the camera's preview size, 
// pictureRect and nativeResRect hold the camera's picture size and its 
// native resolution, respectively. 
RectF previewRect = new RectF(0, 0, 480, 800), 
     pictureRect = new RectF(0, 0, 1080, 1920), 
     nativeResRect = new RectF(0, 0, 1952, 2592), 
     resultRect = new RectF(0, 0, 480, 800); 

final Matrix scaleMatrix = new Matrix(); 

// create a matrix which scales coordinates of preview size rectangle into the 
// camera's native resolution. 
scaleMatrix.setRectToRect(previewRect, nativeResRect, Matrix.ScaleToFit.CENTER); 

// map the result rectangle to the new coordinates 
scaleMatrix.mapRect(resultRect); 

// create a matrix which scales coordinates of picture size rectangle into the 
// camera's native resolution. 
scaleMatrix.setRectToRect(pictureRect, nativeResRect, Matrix.ScaleToFit.CENTER); 

// invert it, so that we get the matrix which downscales the rectangle from 
// the native resolution to the actual picture size 
scaleMatrix.invert(scaleMatrix); 

// and map the result rectangle to the coordinates in the picture size rectangle 
scaleMatrix.mapRect(resultRect); 

Dopo tutte queste manipolazioni del resultRect conterrà le coordinate della zona all'interno della foto scattata dalla fotocamera, che corrispondono alla esattamente la stessa immagine che hai visto nell'anteprima della tua app. È possibile tagliare quest'area dall'immagine con il metodo BitmapRegionDecoder.html#decodeRegion(android.graphics.Rect, android.graphics.BitmapFactory.Options).

E questo è tutto.

+1

Ehi, bene, so che questa soluzione è vecchia ma forse puoi aiutarti - come posso farlo funzionare quando l'anteprima della foto è * più grande * delle dimensioni dello schermo? quindi screenWidth <= previewWidth && screenHeight <= previewHeight a seconda del dispositivo. Grazie –

+0

Ehi. come si ottiene nativeResRect? – Dima

+0

@aga dove dovrei inserire questo codice? Grazie – JayVDiyk

Problemi correlati