2015-07-28 20 views
5

Używając biblioteki androida poślizgu otrzymuję obraz jako bitmapę (see glide documentation), a następnie próbuję zamazać mapę bitową, używając renderscript i ScriptIntrinsicBlur, który jest rozmycie Gaussa. (Taken from this stackoverflow post)RenderScript nie renderuje poprawnie ScriptIntrinsicBlur, powodując, że ScriptIntrinsicBlur renderuje tęczę kolorów.

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); 
     } 
    }); 

Problemem jest to, że jest to wyjście, zamiast rozmazany obraz: enter image description here

Każda pomoc będzie mile widziane dzięki. :)

Odpowiedz

3

Czy to możliwe, że obraz wejściowy nie jest U8_4 (to jest RGBA8888)? Czy możesz przełączyć się z "Element.U8_4 (rs)" zamiast używać "output.getElement()"? To by prawdopodobnie postąpiło właściwie. Jeśli okaże się, że obraz nie jest RGBA8888, możesz przynajmniej otrzymać wyjątek Javy opisujący format bazowy (jeśli nie jest on obsługiwany przez naszą rozmycie).

+0

To jest błąd, który otrzymuję: 'android.support.v8.renderscript.RSIllegalArgumentException: Unsuported element type.' Dzięki za próbę pomocy :) – HaloMediaz

+0

Ok. Rozgryzłem problem. Glide ładuje bitmapy w RGB_565. Glides ma opcję użycia ARGB_8888, ale nadal daje mi ten sam problem. Dzięki za pomoc. – HaloMediaz

+0

ScriptIntrinsicBlur nie obsługuje konfiguracji bitmapowych innych niż RGBA_8888. Ale @zinuzoid miał świetne rozwiązanie, które działa dla mnie: sentBitmap.copy (Bitmap.Config.ARGB_8888, true); – goRGon

6

Ponieważ obsługuje tylko format U8_4 i U8. Konieczne będzie przekonwertowanie mapy bitowej na ARGB_8888 przed wysłaniem jej do RenderScript w tym przykładzie.

 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

Sprawdziło się dobrze dla mnie, dzięki kolego –

Powiązane problemy