Android zxing: l’anteprima della fotocamera verticale / vista surreale è allungata / deformata

Sono riuscito a utilizzare la risposta qui per ruotare l’anteprima della fotocamera in verticale: http://code.google.com/p/zxing/issues/detail?id=178#c46

tuttavia l’anteprima stessa è allungata / deformata: sembra che l’altezza si allunghi per riempire la scatola (ma potrebbe essere che la larghezza sia troppo grande per lo schermo e che venga schiacciata per adattarsi)

C’è un modo per “avvolgere” il contenuto piuttosto che renderlo flessibile per adattarlo alla vista?

EDIT: l’ho ordinato modificando il metodo ‘findBestPreviewSizeValue’ nel ‘CameraConfigurationManager’ e invertendo i punti X e Y (grazie a sean owen per il puntatore sotto!), Ecco il codice:

private static Point findBestPreviewSizeValue(CharSequence previewSizeValueString, Point screenResolution) { int bestX = 0; int bestY = 0; int diff = Integer.MAX_VALUE; for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) { previewSize = previewSize.trim(); int dimPosition = previewSize.indexOf('x'); if (dimPosition < 0) { Log.w(TAG, "Bad preview-size: " + previewSize); continue; } int newX; int newY; try { newY = Integer.parseInt(previewSize.substring(0, dimPosition)); newX = Integer.parseInt(previewSize.substring(dimPosition + 1)); //original: //newX = Integer.parseInt(previewSize.substring(0, dimPosition)); //newY = Integer.parseInt(previewSize.substring(dimPosition + 1)); } catch (NumberFormatException nfe) { Log.w(TAG, "Bad preview-size: " + previewSize); continue; } int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y); if (newDiff == 0) { bestX = newY; bestY = newX; //original: //bestX = newX; //bestY = newY; break; } else if (newDiff  0 && bestY > 0) { return new Point(bestX, bestY); } return null; } 

Devi fare un bel po ‘di più per farlo funzionare piuttosto che impostare l’anteprima sulla modalità verticale. Ad esempio, devi scegliere una dimensione di anteprima appropriata ora che è in verticale, non orizzontale.

Il confezionamento non è sicuramente desiderabile? No, non puoi farcela; SurfaceView sempre l’intera immagine di anteprima sul SurfaceView , allungando se necessario. Suppongo che potresti reimplementare molto di quel codice per fare qualcosa di diverso, ma sarebbe piuttosto difficile.

Ho avuto lo stesso problema ma ho potuto risolverlo invertendo le proporzioni sul file CameraConfigurationManager.java all’interno di findBestPreviewSizeValue cambiando questo

  float screenAspectRatio = (float) screenResolution.x / (float) screenResolution.y; 

a questa

  float screenAspectRatio = (float) screenResolution.y / (float) screenResolution.x; 

Ho trovato la soluzione qui.

http://bighow.net/4660010-Android_zxing___portrait_camera_preview_surfaceview_is_stretched_warped.html

Puoi ottenere le dimensioni di Priview con questa funzione:

Elenco privato mSupportedPreviewSizes = parameters.getSupportedPreviewSizes ();

 if (mSupportedPreviewSizes != null) { mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); } private Camera.Size getOptimalPreviewSize(List sizes, int w, int h) { final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) h / w; if (sizes == null) return null; Camera.Size optimalSize = null; double minDiff = Double.MAX_VALUE; int targetHeight = h; for (Camera.Size size : sizes) { double ratio = (double) size.height / size.width; if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } if (optimalSize == null) { minDiff = Double.MAX_VALUE; for (Camera.Size size : sizes) { if (Math.abs(size.height - targetHeight) < minDiff) { optimalSize = size; minDiff = Math.abs(size.height - targetHeight); } } } return optimalSize; } float ratio; if (mPreviewSize.height >= mPreviewSize.width) ratio = (float) mPreviewSize.height / (float) mPreviewSize.width; else ratio = (float) mPreviewSize.width / (float) mPreviewSize.height; after getting ratio set your size in protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension((int) (width * ratio), height); } 

Sono riuscito a farlo funzionare cambiando sotto il codice in CameraConfigurationManager.java :

float screenAspectRatio = (float) screenResolution.x / (float) screenResolution.y;

A:

 float screenAspectRatio = (float) screenResolution.y / (float) screenResolution.x; 

E

 float aspectRatio = (float) maybeFlippedWidth / (float) maybeFlippedHeight; 

A:

 float aspectRatio = (float) maybeFlippedHeight / (float) maybeFlippedWidth; 

Ho fatto questo a fianco di questo post: Zxing Camera in modalità verticale su Android

Spero che questo aiuti gli altri.

Il motivo della deformazione potrebbe essere dovuto al fatto che il rapporto di aspetto della fotocamera non corrisponde al formato dello schermo.

La maggior parte delle proporzioni dello schermo del cellulare è 4: 3, ad esempio 2560×1440, 1920×1080 e così via. Quando si utilizza parameter.setPreviewSize (larghezza, altezza) per impostare la dimensione dell’anteprima della telecamera, se il valore dell’altezza: larghezza non equivale al rapporto dello schermo del telefono, l’immagine della telecamera verrà deformata per riempire lo schermo.