我正在使用 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 等),但图像根本没有改变...
我错过了什么?
最佳答案
我认为您不需要 BaseRepeatedPostProcessor
在你的情况下。
正常BasePostProcessor
在这里应该足够了。
但是,问题似乎出在您的自定义过滤器上:
@Override
public void process(Bitmap bitmap) {
bitmap = filter.renderImage(bitmap);
}
我想它会返回一个不同的位图?这在 Java/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
.
关于Android fresco lib,应用自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39410777/