2015-05-20 9 views
9

il titolo suona forse un po 'come una "domanda noob" ma so benissimo come programmare per Android, solo per capire qual è il modo migliore per ottenere ciò che voglio.Carica una foto scattata dalla fotocamera a un server con dimensioni limitate

Il mio caso d'uso è: l'utente scatta una foto e la invia al nostro server che ha un limite di dimensioni del file (il che potrebbe significare che dobbiamo ridimensionare la foto direttamente sul dispositivo).

Sembra facile, giusto? Il mio problema sono le seguenti:

1) uso migliore intenti che potrebbe mandare in crash perché alcune applicazioni della fotocamera sono codificati con l'asino o costruire una vista di base "scattare foto e confermare" con librerie fotocamera CAWC? (Ho fatto i due, preferisco gli intenti ma mi piacerebbe avere un'opinione in merito).

2) Come si gestisce il limite di dimensioni del file ? Voglio dire che ottenere le dimensioni della foto è abbastanza semplice con lo File.length() (anche se il valore restituito non è perfettamente corretto) ma se superi il limite, come puoi dire quanto sarà grande l'immagine ridimensionata? (è necessario convertire in bitmap per ridimensionarlo ed è quindi un sacco di problemi con OOMException e non è possibile calcolare la dimensione finale di una bitmap sul disco, è necessario comprimerlo e scriverlo sul disco e analizzare il file appena creato dopo).

Grazie aiuto: D

+1

Per limitare la dimensione dell'immagine, è necessario ricampionare la foto prima del caricamento – Xcihnegn

risposta

4

ho fatto la stessa cosa prima.

1.Io intendo chiamare l'altra app fotocamera e all'interno diActivityResult, torno all'URI e lo elabro come ho bisogno.

  1. Ridimensioniamo l'immagine, ma mantengo anche il rapporto originale e lo ruota in base ai dati exif. Speriamo che questo ridimensionamento del codice possa darti qualche suggerimento.

    public static Bitmap DecodeImage(String path, int resolution) { 
    BitmapFactory.Options opts = new BitmapFactory.Options(); 
    
    opts.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(path, opts); 
    opts.inSampleSize = computeSampleSize(opts, -1, resolution); 
    opts.inJustDecodeBounds = false; 
    return BitmapFactory.decodeFile(path, opts); 
        } 
    
    public static int computeSampleSize(BitmapFactory.Options options, 
               int minSideLength, int maxNumOfPixels) { 
    int initialSize = computeInitialSampleSize(options, minSideLength, 
         maxNumOfPixels); 
    
    int roundedSize; 
    
    if (initialSize <= 8) { 
        roundedSize = 1; 
        while (roundedSize < initialSize) { 
         roundedSize <<= 1; 
        } 
    } else { 
        roundedSize = (initialSize + 7)/8 * 8; 
    } 
    
    return roundedSize; 
        } 
    
    private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) { 
    double w = options.outWidth; 
    double h = options.outHeight; 
    
    int lowerBound = (maxNumOfPixels == -1) ? 1 : 
         (int) Math.ceil(Math.sqrt(w * h/maxNumOfPixels)); 
    
    int upperBound = (minSideLength == -1) ? 128 : 
         (int) Math.min(Math.floor(w/minSideLength), 
           Math.floor(h/minSideLength)); 
    
    if (upperBound < lowerBound) { 
        // return the larger one when there is no overlapping zone. 
        return lowerBound; 
    } 
    
    if ((maxNumOfPixels == -1) && 
    
         (minSideLength == -1)) { 
        return 1; 
    } else if (minSideLength == -1) { 
        return lowerBound; 
    } else { 
        return upperBound; 
    } 
    
        } 
    

    La soluzione non è fantasia, ma è quello che ho fatto nel progetto, e noi finora non hanno problemi con esso dopo il rilascio.

1

Ci sono molte domande su questo argomento e speriamo di averlo cercato.

Q) Meglio utilizzare gli intenti che potrebbero bloccarsi perché alcune app della fotocamera sono codificate con il culo o creare una vista di base "scattare foto e confermare" con le librerie della fotocamera cawc? (Ho fatto i due, preferisco gli intenti ma mi piacerebbe avere un'opinione in merito).

A) Gli intenti sono i migliori perché sono integrati, alcuni produttori di dispositivi desiderano ritagliare e ridimensionare le immagini e mi trovo ad affrontare problemi simili di non averlo sullo stesso produttore ma sul dispositivo precedente. Un'app di terze parti stabile/affidabile è sufficiente per le operazioni di base.

Q) Come si gestisce il limite di dimensione del file? Voglio dire, ottenere la dimensione della foto è abbastanza semplice con File.length() (anche se il valore restituito non è perfettamente corretto) ma se superi il limite, come puoi dire quanto sarà grande l'immagine ridimensionata?(è necessario convertire in bitmap per ridimensionarlo e sono quindi presenti molti problemi con OOMException e non è possibile calcolare la dimensione finale di una bitmap sul disco, è necessario comprimerlo e scriverlo sul disco e analizzare il file appena creato dopo) .

A)

  1. Come si fa a gestire il limite di dimensione del file? Il limite di dimensioni dipende dalla fotocamera, se si dispone di una fotocamera da 10 megapixel, la dimensione risultante sarebbe maggiore di 5 megapixel (si spera che si ottenga la parte).
  2. È necessario convertire in bitmap per ridimensionarlo ed è quindi un sacco di problemi con OOMException e non è possibile calcolare la dimensione finale di una bitmap sul disco È possibile calcolare la dimensione dell'immagine o campionarla o ritagliarla o ridimensionarla a patto che mantieni intatte le best practice di Android, ricicla la bitmap non appena hai finito con le operazioni bitmap. Ho un'app che ha centinaia di immagini e la maggior parte di loro viene inviata al server e alcune volte lancia OOM, quindi la gestisco di conseguenza.
1

È possibile attraversato il link Loading Large Bitmap

hanno spiegato molto bene per quanto riguarda il ridimensionamento bitmap. Per favore fatemi sapere se non ottenete alcun punto in questo collegamento.

Grazie

Problemi correlati