Autore Topic: Creazione immagine molto grande  (Letto 1024 volte)

Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Creazione immagine molto grande
« il: 11 Giugno 2010, 11:52:34 CEST »
0
Salve a tutti!
Innanzitutto davvero un sentito apprezzamento al forum che e' sempre fonte di ottimi spunti e consigli!

Avrei da porre una domanda relativa ad un problema su cui mi arrovello gia' da qualche giorno:
devo generare una immagine di dimensione piuttosto elevata (puo' raggiungere anche i 2000x3000 pixel) e permettere il salvataggio della stessa sulla sd del telefono. Il problema e' che nel momento stesso in cui provo a creare una bitmap di tali dimensioni con Bitmap.createBitmap(), ovviamente sforo il limite di memoria disponibile per una singola applicazione.

Mi chiedevo: e' possibile agirare in qualche modo il problema appoggiandosi magari ad un buffer sulla memoria fisica del telefono e salvando di volta in volta tot byte dell'immagine su sd? L'immagine grande la posso generare riga per riga, ad esempio.. Ma non saprei proprio come fare e se, una volta salvato un bell'array di bytes contenente tutti i dati relativi all'immagine su sd (che cmq avrebbe dimensione piuttosto elevata) posso da quello ricostruire e salvare la relativa immagine jpg senza cadere nuovamente nell' OutOfMemoryError..
Spero di essere riuscito a spiegare in maniera chiara il mio problema :-)

Vi ringrazio per l'aiuto,
Michele

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Creazione immagine molto grande
« Risposta #1 il: 11 Giugno 2010, 13:28:47 CEST »
0
puoi postare il pezzo di codice (forse anche una sola riga) relativo al caricamento della Bitmap?
ho in mente una soluzione :)

Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Re:Creazione immagine molto grande
« Risposta #2 il: 11 Giugno 2010, 16:11:07 CEST »
0
puoi postare il pezzo di codice (forse anche una sola riga) relativo al caricamento della Bitmap?
ho in mente una soluzione :)

Certo :-)
Beh.. per adesso in realta' quando creo l'immagine la ridimensiono secondo un valore di scala proprio per non incorrere nell'OutOfMemory..
Speravo di trovare un modo che mi evitasse di dover scalare l'immagine..


Ecco cmq il codice attuale:

Codice (Java): [Seleziona]
public static float MASSIMA_DIMENSIONE_IMMAGINE_COMPLESSIVA = 1200f;

float scala=Math.min(1f, (MASSIMA_DIMENSIONE_IMMAGINE_COMPLESSIVA/(Math.max(rect_img_finale.width(), rect_img_finale.height()))));
Log.i("Info","Per rispettare la massima dimensione consentita, l'immagine complessiva verra' scalata di "+scala);
result = Bitmap.createBitmap((int)(rect_img_finale.width()*scala), (int)(rect_img_finale.height()*scala), Bitmap.Config.RGB_565);
canvas.setBitmap(result);
for (int i=1;i<params.length;i++){
        try{
                matrice[i].postScale(scala, scala);
                Bitmap temp = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(),params[i]), 0, 0,(int) rect_img[i].right,(int) rect_img[i].bottom, matrice[i], true);
                canvas.drawBitmap(temp,(rect_img_trasformata[i].left+x_shift)*scala,(rect_img_trasformata[i].top+y_shift)*scala,null);
                temp.recycle();
        } catch (OutOfMemoryError E) {
                Log.e("Errore","OutOfMemoryError nella creazione dell'immagine complessiva per l'immagine "+i);
        }
}

//Ed infine la vado a salvare nella sd.. il codice piu' o meno e' il classico
ByteArrayOutputStream bos = new ByteArrayOutputStream();
result.compress(CompressFormat.JPEG,100,bos);
result.recycle();
               
Come si vede dal codice, attualmente viene generata l'immagine finale (per ora con dimensione massima di (1200x1200) e poi vengono aggiunte ad una ad una tot immagini.. per adesso le disegno una ad una per intero, ma se dovessi trovare una soluzione come quella che immaginavo nel primo messaggio, potrei cmq scriverle riga per riga e non immagine per immagine (immagino infatti che se dovessi scriverla in un buffer o in un array di bytes, dovrei lavorare su di essa con ordine..riga per riga appunto).

« Ultima modifica: 11 Giugno 2010, 16:16:38 CEST da Miccar »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:Creazione immagine molto grande
« Risposta #3 il: 11 Giugno 2010, 16:32:44 CEST »
0
potresti giocare con queste opzioni della BitmapFactory:
BitmapFactory.Options | Android Developers

in particolare:

Options o=new Options();
o.inSampleSize=2; // o anche 4

ma prova anche le altre opzioni... ;)

quando crei la bmp a partire dalla risorsa usa questo metodo:
BitmapFactory | Android Developers




Offline Miccar

  • Nuovo arrivato
  • *
  • Post: 11
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus, Motorola Milestone
Re:Creazione immagine molto grande
« Risposta #4 il: 13 Giugno 2010, 01:30:29 CEST »
0
Innanzitutto grazie per la risposta!

potresti giocare con queste opzioni della BitmapFactory:
BitmapFactory.Options | Android Developers

in particolare:

Options o=new Options();
o.inSampleSize=2; // o anche 4

ma prova anche le altre opzioni... ;)

Se ho capito bene, l'opzione di cui parli mi permette di scalare l'immagine.. Ma io voglio qualcosa che mi permetta esattamente di fare il contrario: evitare di scalarla..

Come dicevo nel messaggio precedente, vorrei riuscire a creare una bitmap molto grande (dall'unione di piu' immagini). Poiche' so che la memoria dinamica per ogni singola app e' limitata (credo 16 mega), creare una immagine di risoluzione elevata la saturerebbe immediatamente. Mi chiedevo quindi se e' possibile creare una immagine appoggiandosi alla memoria fisica del telefono come se fosse una sorta di espansione di memoria dinamica...


quando crei la bmp a partire dalla risorsa usa questo metodo:
BitmapFactory | Android Developers

Ti ringrazio per la segnalazione, cambio il metodo (anche se presto dovro' cambiare nuovamente perche' dovro' appoggiarmi alle immagini sulla sd e non piu' su risorse precaricate) :D