【问题标题】:RenderScript not rendering ScriptIntrinsicBlur correctly, causing the ScriptIntrinsicBlur to render a rainbow of colorsRenderScript 未正确渲染 ScriptIntrinsicBlur,导致 ScriptIntrinsicBlur 渲染出彩虹般的颜色
【发布时间】:2015-10-18 09:15:58
【问题描述】:

使用 glide android 库,我将图像作为位图 (see glide documentation),然后尝试使用 renderscript 和 ScriptIntrinsicBlur 模糊位图,这是一种高斯模糊。 (Taken from this stackoverflow post)

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

问题在于这是输出,而不是模糊的图像:

任何帮助将不胜感激,谢谢。 :)

【问题讨论】:

    标签: android bitmap imageview renderscript


    【解决方案1】:

    输入图像是否可能不是 U8_4(即 RGBA8888)?您可以从使用“Element.U8_4(rs)”切换到使用“output.getElement()”吗?那可能会做正确的事情。如果事实证明图像不是 RGBA8888,您至少可能会得到一个 Java 异常,描述底层格式是什么(如果我们的 Blur 不支持它)。

    【讨论】:

    • 这是我得到的错误:'android.support.v8.renderscript.RSIllegalArgumentException:不支持的元素类型。'感谢您的帮助:)
    • 好的。我解决了这个问题。 Glide 以 RGB_565 加载位图。 Glides 可以选择使用 ARGB_8888,但这仍然给我同样的问题。感谢您的帮助。
    • ScriptIntrinsicBlur 不支持非 RGBA_8888 位图配置。但是@zinuzoid 有一个非常适合我的解决方案:sentBitmap.copy(Bitmap.Config.ARGB_8888, true);
    【解决方案2】:

    因为它只支持 U8_4 和 U8 格式。通过本示例,您必须先将位图转换为 ARGB_8888,然后再将其发送到 RenderScript。

            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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多