我正在使用壁画向我的应用显示图像。现在我正在尝试对我的图像应用一些过滤器,但问题是过滤器库只会产生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等..)但图像根本没有变化......
我缺少什么?
答案 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才能使更改生效。