Autore Topic: Resize Immagini  (Letto 616 volte)

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Resize Immagini
« il: 16 Luglio 2014, 11:52:52 CEST »
0
Ciao a tutti ragazzi,

devo trovare un algoritmo che mi faccia un resize dell' immagine da originale a 1024x768.

Ho trovato parecchie soluzioni col BitmapFactory.Options e options.inSampleSize ma  non riesco ad avere una foto precisamente di 1024x768.

La mia prova:
Codice: [Seleziona]
  public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
 // Raw height and width of image
 final int height = options.outHeight;
 final int width = options.outWidth;
 int inSampleSize = 1;

 if (height > reqHeight || width > reqWidth) {

     final int halfHeight = height / 2;
     final int halfWidth = width / 2;

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both
     // height and width larger than the requested height and width.
     while ((halfHeight / inSampleSize) > reqHeight
             && (halfWidth / inSampleSize) > reqWidth) {
         inSampleSize *= 2;
     }
 }

 return inSampleSize;
}


&


Codice: [Seleziona]
public static Bitmap decodeSampledBitmapFromResource(byte[] data,
         int reqWidth, int reqHeight) {

     // First decode with inJustDecodeBounds=true to check dimensions
     final BitmapFactory.Options options = new BitmapFactory.Options();
     options.inJustDecodeBounds = true;
     BitmapFactory.decodeByteArray(data, 0, data.length,
           options);

     // Calculate inSampleSize
     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

     // Decode bitmap with inSampleSize set
     options.inJustDecodeBounds = false;
     return BitmapFactory.decodeByteArray(data, 0, data.length,
           options);
 }

Questo algoritmo non mi fa il resize corretto in altezza!!! :(

Grazie in anticipo ragazzi.

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Resize Immagini
« Risposta #1 il: 16 Luglio 2014, 12:28:11 CEST »
0
In generale il problema di questi metodi è che lavorano scalando per potenze di 2.
Se tu hai una immagine di 1030x800 l'immagine che viene fuori è 515x400. Cioè per ogni pixel dell'immagine finale prendi un numero di pixel originali pari alla più piccola potenza di 2 tale che l'immagine sia contenuta nella risoluzione che hai passato. In questo caso 2^1.

Per fare quello che ti serve devi calcolare la scala per l'asse x, la scala per l'asse y creare una matrice con quelel scale e applicarla all'immagine creando al contempo una nuova bitmap.

 :-)

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Resize Immagini
« Risposta #2 il: 16 Luglio 2014, 13:18:48 CEST »
0
In generale il problema di questi metodi è che lavorano scalando per potenze di 2.
Se tu hai una immagine di 1030x800 l'immagine che viene fuori è 515x400. Cioè per ogni pixel dell'immagine finale prendi un numero di pixel originali pari alla più piccola potenza di 2 tale che l'immagine sia contenuta nella risoluzione che hai passato. In questo caso 2^1.

Per fare quello che ti serve devi calcolare la scala per l'asse x, la scala per l'asse y creare una matrice con quelel scale e applicarla all'immagine creando al contempo una nuova bitmap.

 :-)

ciao,
grazie per la risposta, avresti mica qualche esempio da passarmi o qualche guida?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Resize Immagini
« Risposta #3 il: 17 Luglio 2014, 12:26:14 CEST »
0
Leggi le dimensioni di una bitmap.
Codice (Java): [Seleziona]
    float X = immagine.getWidth();
    float Y = immagine.getHeight();
Calcoli la scala:
Codice (Java): [Seleziona]
    float scalaX = nuovaX / X;
    float scalaY = nuovaY / Y;
Crei la matrice:
Codice (Java): [Seleziona]
    Matrix matrice = new Matrix();
    matrice.postScale(scalaX, scalaY);

A questo punto crei una nuova bitmap con Bitmap.createBitmap partendo da immagine e usando matrice.
 :-)

Offline Fullydroid

  • Nuovo arrivato
  • *
  • Post: 34
  • Respect: +1
    • Mostra profilo
Re:Resize Immagini
« Risposta #4 il: 22 Luglio 2014, 08:50:26 CEST »
0
Leggi le dimensioni di una bitmap.
Codice (Java): [Seleziona]
    float X = immagine.getWidth();
    float Y = immagine.getHeight();
Calcoli la scala:
Codice (Java): [Seleziona]
    float scalaX = nuovaX / X;
    float scalaY = nuovaY / Y;

Crei la matrice:
Codice (Java): [Seleziona]
    Matrix matrice = new Matrix();
    matrice.postScale(scalaX, scalaY);

A questo punto crei una nuova bitmap con Bitmap.createBitmap partendo da immagine e usando matrice.
 :-)


grazie mille!
Funziona tutto perfettamente!
 :-P