JavascriptProva

giovedì 15 settembre 2016

ExifInterface

ExifInterface è la classe da cui partire.

Si fa qualcosa tipo ExifInterface exifInterface=new ExifInterface(path)? Sì. Perlomeno questo lo abbiamo capito.

Poi si mette in opera il metodo che restituisce un attributo, che dovrebbe essere l'orientamento dell'immagine.
L'orientamento è un tipo int.
Questo può servire come mnemonico per ricordare che il metodo di ExifInterface è ExifInterface.getAttributeInt.

I parametri di questo metodo mi risultano oscuri.
Ecco: la firma del metodo sarebbe questa:
int getAttributeInt (String tag, int defaultValue)
Praticamente rileva il valore del tag exif con un valore di default nel caso in cui quello non sia disponibile.
Cosa è un tag exif?

Exif sta per EXchangeable Image file Format.
Non sarebbe altro che un formato JPEG o altro con l'aggiunta di dati che sarebbero appunto i TAG.
Fra questi dati ci sono ANCHE quelli relativi all'orientamento dell'immagine.
Appunto, se un'immagine viene salvata come formato Exif, viene incorporata anche un'informazione sull'orientamento dell'immagine, che se non viene tenuta in considerazione può lasciare che l'immagine si presenti rovesciata a seconda di come è stata scattata.
Dunque si deve verificare il tag TAG_ORIENTATION, che è un dato numerico, lasciando che in assenza di questo TAG venga letto il TAG ORIENTATION_NORMAL.


Adesso ho le idee più chiare.
Adesso devo studiarmi ScaleType.
Non vorrei ricorrere alle opzioni di BitmapFactory per ridimensionare l'immagine alle dimensioni della ImageView relativa.
Un momento! Ho impiegato un po' di tempo per decifrare, e ho trovato degli spunti nel codice di J-Communicator.
Posso provare con setBounds, che sarebbe un metodo di Drawable.
Vediamo se è applicabile anche alla bitmap.
No, sembra solo di Drawable. Ho provato a farlo con una bitmap e non trovo questo metodo nell'intelliSense.

C'è modo di piazzare l'immagine nei limiti di una ImageView?
Vediamo: io ho una ImageView delle dimensioni di 200.


        mainLayout=(RelativeLayout)findViewById(R.id.mainLayout);
        imageView=new ImageView(this);
        imageView.setBackgroundColor(Color.WHITE);
        imageView.setImageResource(R.drawable.genio);
        button=new Button(this);
        mainLayout.addView(imageView);
        mainLayout.addView(button);
        RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams)imageView.getLayoutParams();
        params.width=200;
        params.height=200;
        params.topMargin=100;
Ecco. Ora provo a piazzarci la bitmap...

Sembra che venga bene! Ben contenuta nell'immagine.

Ora cambio le dimensioni dell'immagine.

        RelativeLayout.LayoutParams params=(RelativeLayout.LayoutParams)imageView.getLayoutParams();
        params.width=300;
        params.height=300;
        params.topMargin=100;

Vediamo...

Viene ancora bene!
Quindi possiamo lasciare questo codice.

Ora provo con un'immagine verticale...
che viene ancora bene, ben posizionata nell'ImageView.


Dunque non c'è bisogno di ridimensionare l'immagine?

Ora però mi voglio occupare di nuovo di traslazione e zooming dell'immagine.
Ho già dimenticato questo argomento, che avevo peraltro visto qualche mese fa.


Per il momento riscriviamo il codice per leggere i tag Exif, a memoria.

            try {
                ExifInterface exifInterface=new ExifInterface(path);
                int orientation=exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
                int rotate=0;
                switch(orientation){
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotate=90;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotate=180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotate=270;
                        break;
                }
                Matrix matrix=new Matrix();
                matrix.postRotate(rotate);
                Bitmap bmp=Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
                imageView.setImageBitmap(bmp);
            } catch (IOException e) {
                e.printStackTrace();
            }
Il risultato c'è ed è perfetto.

Nessun commento:

Posta un commento