2012-12-25 3 views
0

J'essaie de faire un filtre d'image simple dans android renderscript, et cela fonctionne pour les petites images. Cependant, je reçois out of memory error pour une image aussi grande qu'une photo prise avec une caméra par exemple (tout fonctionne bien pour les petites images cependant). Je sais que mon code est un peu moche (la plupart du temps copié à partir here), de sorte que toute astuce sur la façon de faire le calcul de renderScript sur grand bitmap est apprécié .. Voici le code pour appeler rs:Allocation de gros bitmap pour rendererscript (android)

RenderScript rs = RenderScript.create(this); 
     Allocation allocIn = Allocation.createFromBitmap(rs, bmp); 
     Allocation allocOut = Allocation.createTyped(rs, allocIn.getType()); 

     ScriptC_sample sc = new ScriptC_sample(rs, getResources(), R.raw.sample); 

     sc.set_in(allocIn); 
     sc.set_out(allocOut); 

     sc.forEach_root(allocIn, allocOut); 

     Bitmap bmpOut = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig()); 
     allocOut.copyTo(bmpOut); 
     imgView.setImageBitmap(bmpOut);  

Et voici ce que je crois pertinentes du fichier rendescript lui-même:

rs_allocation in; 

void root(const uchar4* v_in, uchar4* v_out, const void* usrData, 
uint32_t x, uint32_t y) { 

    float4 curPixel = rsUnpackColor8888(*v_in); 

    // ... computations 

    *v_out = rsPackColorTo8888(curPixel.r, curPixel.g, curPixel.b, curPixel.a); 
} 

Je ne comprends que je ne peux pas vraiment charger un gros bitmap à la mémoire (je peux charger le fichier dans imageView bien?), et je l'ai déjà utilisé pour gérer inJustDecodeBounds Mais ici, je n'ai aucune idée de comment et où l'utiliser, et je ne veux pas redimensionner l'image bitmap (je voudrais traiter le fichier original et sauver mo fichier difié de la même taille)

Répondre

1

Si vous utilisez des périphériques avec Android 2.3.3 ou version ultérieure, vous pouvez utiliser BitmapRegionDecoder pour lire uniquement une partie d'un fichier image. Par conséquent, vous pouvez lire dans une région, la traiter et enregistrer les résultats, puis répéter jusqu'à ce que toute l'image ait été traitée.

Selon le traitement de l'image que vous effectuez, vous devrez peut-être chevaucher les régions pour traiter correctement leurs bords. Dans le cadre Android, je ne crois pas qu'il existe un équivalent de BitmapRegionDecoder pour sauvegarder de grandes images dans des sections, donc vous devrez utiliser une bibliothèque externe pour y parvenir. Quelque chose comme PNGJ permet de charger ligne par ligne et d'enregistrer des fichiers PNG (je n'ai pas utilisé PNGJ donc je ne peux pas commenter la bibliothèque elle-même).

+0

Merci, j'ai déjà compris 'BitmapRegionDecoder', heureux de vous confirmer. N'y a-t-il vraiment aucun moyen de sauvegarder le fichier sans utiliser de bibliothèques externes? – wasyl