【问题标题】:Android fresco lib , apply custom filterAndroid fresco lib,应用自定义过滤器
【发布时间】:2017-01-17 13:22:51
【问题描述】:

我正在使用 fresco 向我的应用程序显示图像。现在我正在尝试对我的图像应用一些过滤器,但问题是过滤器库只产生位图。但 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);

这里是后处理器

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 等),但图像根本没有改变...

我错过了什么?

【问题讨论】:

    标签: android image filter fresco


    【解决方案1】:

    我认为您的情况不需要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。

    【讨论】:

    • 我需要重复处理器,因为我应该能够多次更改过滤器。你的帖子实际上很有帮助。我需要做的就是在最后添加超级
    【解决方案2】:

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

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

    我没有注意到您必须调用 super 才能使更改生效。

    【讨论】:

    • 嗯,这行得通,因为如果你看一下源代码,超级会Bitmaps.copyBitmap(destBitmap, sourceBitmap);。通常,您不应该在覆盖时调用 super。您可以致电 Bitmaps.copyBitmap(destBitmap, sourceBitmap);。但是,不过滤临时位图是理想的,因为您现在在内存中有 3 个而不是 2 个位图,并且您过滤的位图也可能存在于 Java 堆上,并且需要清理 GC,这并不理想。
    猜你喜欢
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2015-09-11
    • 2017-09-12
    相关资源
    最近更新 更多