2015-07-28 11 views
5

Utilizzando la libreria di glide Android ottengo l'immagine come bitmap (see glide documentation) e quindi provo a sfocare la bitmap, utilizzando renderscript e ScriptIntrinsicBlur, che è un sfocatura gaussiana. (Taken from this stackoverflow post)RenderScript non esegue il rendering di ScriptIntrinsicBlur correttamente, causando ScriptIntrinsicBlur per il rendering di un arcobaleno di colori

Glide.with(getApplicationContext()) 
    .load(ImageUrl) 
    .asBitmap() 
    .into(new SimpleTarget<Bitmap>(300,200) { 
     @Override 
     public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) { 

      RenderScript rs = RenderScript.create(mContext); // context = this. this referring to the activity 

      final Allocation input = Allocation.createFromBitmap(rs, resource, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); 
      final Allocation output = Allocation.createTyped(rs, input.getType()); 
      final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); 
      script.setRadius(8f); 
      script.setInput(input); 
      script.forEach(output); 
      output.copyTo(resource); 

      mImageView.setImageBitmap(resource); 
     } 
    }); 

Il problema è che questo è l'uscita, piuttosto che un'immagine sfocata: enter image description here

Qualsiasi aiuto sarebbe molto apprezzato grazie. :)

risposta

3

È possibile che l'immagine di input non sia un U8_4 (ad esempio RGBA8888)? Puoi passare dall'usare "Elemento.U8_4 (rs)" per usare invece "output.getElement()"? Probabilmente farebbe la cosa giusta. Se si scopre che l'immagine non è RGBA8888, potresti almeno ottenere un'eccezione Java che descrive quale sia il formato sottostante (se non è supportato con la nostra sfocatura).

+0

Questo è l'errore che ottengo: 'android.support.v8.renderscript.RSIllegalArgumentException: tipo di elemento non selezionato.' Grazie per aver cercato di aiutare :) – HaloMediaz

+0

Ok. Ho capito qual è il problema. Glide carica bitmap in RGB_565. Glides ha un'opzione per usare ARGB_8888, ma questo mi dà lo stesso problema. Grazie per l'aiuto. – HaloMediaz

+0

ScriptIntrinsicBlur non supporta le configurazioni bitmap non RGBA_8888. Ma @zinuzoid aveva un'ottima soluzione che funziona per me: sentBitmap.copy (Bitmap.Config.ARGB_8888, true); – goRGon

6

Poiché supporta solo il formato U8_4 e U8. Dovrai convertire la tua bitmap in ARGB_8888 prima di inviarlo a RenderScript con questo esempio.

 Bitmap U8_4Bitmap; 
     if(sentBitmap.getConfig() == Bitmap.Config.ARGB_8888) { 
      U8_4Bitmap = sentBitmap; 
     } else { 
      U8_4Bitmap = sentBitmap.copy(Bitmap.Config.ARGB_8888, true); 
     } 

     //============================== 

     Bitmap bitmap = Bitmap.createBitmap(U8_4Bitmap.getWidth(), U8_4Bitmap.getHeight(), U8_4Bitmap.getConfig()); 

     final RenderScript rs = RenderScript.create(context); 
     final Allocation input = Allocation.createFromBitmap(rs, 
       U8_4Bitmap, 
       Allocation.MipmapControl.MIPMAP_NONE, 
       Allocation.USAGE_SCRIPT); 

     final Allocation output = Allocation.createTyped(rs, input.getType()); 
     final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, output.getElement()); 
     script.setRadius(radius); 
     script.setInput(input); 
     script.forEach(output); 
     output.copyTo(bitmap); 
     rs.destroy(); 
     return bitmap; 
+0

Ha funzionato bene per me, grazie amico –