Autore Topic: Come ridurre la risoluzione delle foto scattate con la Camera.  (Letto 793 volte)

Offline Scanca89

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3neo
  • Sistema operativo:
    Windows 10
Come ridurre la risoluzione delle foto scattate con la Camera.
« il: 05 Settembre 2017, 17:02:05 CEST »
0
Buonasera,

nella mia app scatto una foto che successivamente devo mostrare all'utente.
In questo modo mando l'intent alla camera del device:
Codice: [Seleziona]
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
startActivityForResult(imageIntent, 0);
E così la inserisco nella imageView:
Codice: [Seleziona]
Bitmap img = decodeFile(image.getPath());
ImageView v = (ImageView)findViewById(R.id.imageView_conf);
v.setImageBitmap(img);
Il problema è che risulta pesante da caricare e rallenta ll'activity che mostra la foto.
Come posso risolvere il problema? Posso settare la Camera con la risoluzione più bassa? Oppure posso comprimere la foto prima di inserirla nel layout?


Offline iClaude

  • Utente normale
  • ***
  • Post: 323
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #1 il: 06 Settembre 2017, 10:02:37 CEST »
0
Certo che si può fare.
Puoi seguire questa guida:
https://developer.android.com/topic/performance/graphics/load-bitmap.html

Oppure utilizzare una libreria esterna come Picasso o Glide che hanno funzioni apposite.

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #2 il: 06 Settembre 2017, 10:13:17 CEST »
0
E' possibile caricare le immagini riducendone la dimensione, anche se è un po' complesso.

In pratica si tratta di caricare un'immagine a dimensione ridotta impostando opportunamente il parametro di caricamento "SampleSize".

Il problema è che così facendo si ottengono misure di larghezza e altezza esponenziali di 2 (4, 8, 16, 32, 64, ecc).

Quello che fa la funzione è trovare il "SampleSize" più adatto alla richiesta, caricare l'immagine ridotta e poi eventualmente ridurla nuovamente in memoria (se necessario).

Per immagini molto grandi si ottiene un discreto miglioramento di prestazioni; per quelle più piccole decisamente no.

Codice (Java): [Seleziona]
        /** Used to smoothly resize images */
        private static Paint antiAliasPaint = null;
        /** Default canvas used to interact with bitmaps */
        private static Canvas canvas = new Canvas();

        /**
         * Load the image at {@code imagePath} as a {@link Bitmap}, scaling it to
         * the specified size and preserving the aspect ratio.
         * @param imagePath Path of the image to load.
         * @param width Required width of the resulting {@link Bitmap}.
         * @param height Required height of the resulting {@link Bitmap}.
         * @param fill {@code true} to fill the empty space with transparent color.
         * @param crop {@code true} to crop the image, {@code false} to resize without cutting the image.
         * @return {@link Bitmap} representing the image at {@code imagePath}.
         */

        public static Bitmap loadResizedBitmap(String imagePath, int width, int height, boolean fill, boolean crop) {
                Bitmap retVal;
               
                BitmapFactory.Options opts = new BitmapFactory.Options();
                opts.inSampleSize = getScale(imagePath, width, height);
                opts.inJustDecodeBounds = false;
               
                Bitmap image = BitmapFactory.decodeFile(imagePath, opts);
               
                if (image == null) {
                        if (imagePath != null) {
                                Log.w("Helper", "Cannot decode " + imagePath);
                        } else {
                                Log.w("Helper", "Path is null: Cannot decode");
                        }
                        return null;
                }
               
                if (image.getWidth() != width || image.getHeight() != height) {
                        //Image need to be resized.
                        int scaledWidth = (image.getWidth() * height) / image.getHeight();
                        int scaledHeight;
                        if ((crop && scaledWidth > width) || (!crop && scaledWidth < width)) {
                                scaledHeight = height;
                        } else {
                                scaledWidth = width;
                                scaledHeight = (image.getHeight() * width) / image.getWidth();
                        }

                        Rect src = new Rect(0, 0, image.getWidth(), image.getHeight());
                        Rect dst = new Rect(0, 0, scaledWidth, scaledHeight);

                        if (fill) {
                                retVal = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
                                dst.offset((width - scaledWidth) / 2, (height - scaledHeight) / 2);
                        } else {
                                retVal = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
                        }
                        retVal.eraseColor(Color.TRANSPARENT);
                       
                        synchronized (canvas) {
                                if (antiAliasPaint == null) {
                                        antiAliasPaint = new Paint();
                                        antiAliasPaint.setAntiAlias(true);
                                        antiAliasPaint.setFilterBitmap(true);
                                        antiAliasPaint.setDither(true);
                                }
                                canvas.setBitmap(retVal);
                                canvas.drawBitmap(image, src, dst, antiAliasPaint);
                        }
                       
                        image.recycle();
                } else {
                        //No need to scale.
                        retVal = image;
                }

                return retVal;
        }
       
        private static int getScale(String imagePath, int desiredWidth, int desiredHeight) {
                //Get image size
                BitmapFactory.Options imageInfo = new BitmapFactory.Options();
                imageInfo.inJustDecodeBounds = true;
                BitmapFactory.decodeFile(imagePath, imageInfo);
               
                //Compute the scaling factor
                int scale = 1;
                int width = imageInfo.outWidth;
                int height = imageInfo.outHeight;
                //if (size < imageInfo.outHeight) size = imageInfo.outHeight;
                //while (size/(scale*2) >= ICON_SIZE) {
                while (width/(scale*2) >= desiredWidth && height/(scale*2) >= desiredHeight) {
                        scale = scale*2;
                }
               
                return scale;
        }

In alternativa puoi utilizzare librerie come Glide.

EDIT: Quello che fa questo codice è più o meno lo stesso descritto nel link di iClaude
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Scanca89

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3neo
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #3 il: 06 Settembre 2017, 15:58:47 CEST »
0
Ho optato per usare la libreria Glide ma non ho avuto miglioramenti.
Il codice che ho usato p questo:
Codice (Java): [Seleziona]
File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Images");
File image = new File(imagesFolder, "image_001.jpg");
Bitmap bit = BitmapFactory.decodeFile(image.getAbsolutePath());
ImageView v = (ImageView)findViewById(R.id.imageView_confSh);
Glide.with(ShowActivity.this)
                .load(image.getPath())
                .into(v);
Come posso comprimere la bitmap?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #4 il: 06 Settembre 2017, 16:04:07 CEST »
0
Così carichi due volte l'immagine.

Togli la riga

Codice (Java): [Seleziona]
Bitmap bit = BitmapFactory.decodeFile(image.getAbsolutePath());
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Scanca89

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3neo
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #5 il: 06 Settembre 2017, 16:47:47 CEST »
0
Si, scusa ma non me ne ero accorto  ???
Ora carica l'immagine in maniera leggera per l'app  ;-)
C'è solo un problema, ma non dipende da questo.
L'immagine, anche se scattata in portrait, risulta in landscape. Ho letto che un problema dei Samung (non ho altri modelli per verificare questa cosa) ma non riesco a riolverla..
Con Glide posso manipolare il file caricato? appunto ruotarlo o ritagliarlo? (vorrei che la foto risultasse quadrata)
« Ultima modifica: 06 Settembre 2017, 16:49:23 CEST da Scanca89 »

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #6 il: 06 Settembre 2017, 17:00:10 CEST »
0
Per ruotare le immagini puoi far riferimento a questo post di StackOverflow: https://stackoverflow.com/questions/34811415/how-to-rotate-image-using-glide-library-like-in-picasso
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Scanca89

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3neo
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #7 il: 06 Settembre 2017, 18:21:00 CEST »
0
Tramite la libreria Picasso ho più funzioni.
Infatti posso fare così:
Codice (Java): [Seleziona]
 Picasso.with(ShowActivity.this)
                .load(image)
                .trasform(rotate)
                .into(v);
Come faccio però a distinguere tra Samsung e non Samsung?
Quando devo ruotare e quando l'immagine è giusta?


Post unito: 06 Settembre 2017, 18:30:42 CEST
In realtà ho risolto perché la libreria stessa sopperisce al BUG Samsung aggiustando l'orientamento della foto.
Vi ringrazio tantissimo per l'aiuto, siete stati preziosissimi  ;-) ;-) ;-)
« Ultima modifica: 06 Settembre 2017, 18:30:42 CEST da Scanca89, Reason: Merged DoublePost »

Offline iClaude

  • Utente normale
  • ***
  • Post: 323
  • Respect: +27
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #8 il: 06 Settembre 2017, 18:42:11 CEST »
0
Picasso mi pare di ricordare non fa il resize automatico delle immagini, a differenza di Glide.
Quindi bisogna aggiungere il metodo .fit() o .resize

Offline Scanca89

  • Nuovo arrivato
  • *
  • Post: 12
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3neo
  • Sistema operativo:
    Windows 10
Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #9 il: 06 Settembre 2017, 19:04:38 CEST »
0
Si, tramite il .resize() credo che ruoti l'immagine nel senso giusto  ;-)

Offline xixietto

Re:Come ridurre la risoluzione delle foto scattate con la Camera.
« Risposta #10 il: 08 Settembre 2017, 00:39:01 CEST »
0
Salve visto che stiamo cercando lo stesso problema.. mi Potresti dire come far prendere una immagine da galleria.. E farla vedere all'utente? Però in pratica la foto presa dovrebbe essere visualizzata ogni volta che l'utente apri una determinata schermata.. quindi presumo che dovrei salvare il nome della foto.. Giusto?

Inviato dal mio SM-G925F utilizzando Tapatalk