Android壁画lib,应用自定义过滤器

时间:2016-09-09 11:40:38

标签: android image filter fresco

我正在使用壁画向我的应用显示图像。现在我正在尝试对我的图像应用一些过滤器,但问题是过滤器库只会产生Bitmap。但不推荐使用draweeView.setImageBitmap。

我也尝试使用像这样的后处理器

    MeshPostprocessor meshPostprocessor = new MeshPostprocessor();
    meshPostprocessor.setFilter(filters.get(0));

    draweeView = (SimpleDraweeView) view.findViewById(R.id.filter_image);

    ImageRequest request = ImageRequestBuilder.newBuilderWithSource(image)
            .setPostprocessor(meshPostprocessor)
            .setResizeOptions(new ResizeOptions(100, 100))
            .build();

    PipelineDraweeController controller = (PipelineDraweeController)
            Fresco.newDraweeControllerBuilder()
                    .setImageRequest(request)
                    .setOldController(draweeView.getController())
                    .build();
    draweeView.setController(controller);

这是PostProcessor

public static class MeshPostprocessor extends BaseRepeatedPostProcessor {
    private AbstractConfig.ImageFilterInterface filter;

    public void setFilter(AbstractConfig.ImageFilterInterface filter) {
        this.filter = filter;
        update();
    }

    @Override
    public String getName() {
        return "meshPostprocessor";
    }

    @Override
    public void process(Bitmap bitmap) {
        bitmap = filter.renderImage(bitmap);
    }
}

因此,当我点击过滤器时,我只需运行此

meshPostprocessor.setFilter(colorFilterConfig.get(position));

我尝试使用调试器,代码遍历所有方法(setFilter,process等..)但图像根本没有变化......

我缺少什么?

2 个答案:

答案 0 :(得分:2)

我认为您的案件中不需要BaseRepeatedPostProcessor。 这里正常BasePostProcessor就足够了。

但是,问题似乎是您的自定义过滤器:

@Override
public void process(Bitmap bitmap) {
    bitmap = filter.renderImage(bitmap);
}

我想它会返回一个不同的位图?这在Java / for Fresco中不起作用。

如果您的过滤器可以进行适当的处​​理,您可以使用process(Bitmap bitmap)并直接修改给定的位图(例如bitmap.setPixel(...))。

如果您无法就地执行此操作,则可以覆盖process(Bitmap destBitmap, Bitmap sourceBitmap)并修改destBitmap

如果您的位图更改了它的大小,您可以覆盖CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory)。但是,在这种情况下,请确保实际使用提供的bitmapFactory来创建新的位图以提高效率。

有关详情,请查看http://frescolib.org/docs/modifying-image.html了解详情,或查看JavaDoc for BasePostprocessor

答案 1 :(得分:0)

好的,所以我解决这个问题的方法就是在这个过程中添加一个超级调用

@Override
public void process(Bitmap dest, Bitmap source) {
        Bitmap filtered = filter.renderImage(source, intensity);
        super.process(dest, filtered);   
}

我没有注意到你必须打电话给super才能使更改生效。