转载

使用 Fresco Processor 进行图片预处理

使用Fresco Processor处理图片

最近把 蝌蚪音客 的图片展现框架由Picasso切换到Fresco,因为Fresco使用的是公共内存区,所以切换之后的效果还是很明显的,之前app的内存占用在60MB左右,切换到Fresco后降低了将近一半。

因为 蝌蚪音客 用到了图片预处理功能,如下图:

使用 Fresco Processor 进行图片预处理 使用 Fresco Processor 进行图片预处理

为了减少dom个数,作品封面左下角的小图标是在图片展现时通过Bitmap绘制上去的。之前Picasso是用transform来处理,Fresco对应的功能是通过Processor来实现的。

感觉Fresco的这个功能没有Picasso封装的方便,Picasso的transform可以支持多个,这样的话如果一个图片需要处理多次,可以通过

  1. Picasso.with(ctx).load(path).transform(new AudioTransform()).transform(new FeaturTransform()).into(imageView);

的方式来实现,但是Fresco不支持这种方式,所以这里对官方的Processor进行了封装

  1. public interface ProcessorInterface {
  2. public void process(Bitmap bitmap);
  3. }
  4. public class TuoFrescoProcessor extends BaseRepeatedPostProcessor {
  5. private ArrayList<ProcessorInterface> processorList = new ArrayList<>();
  6. public TuoFrescoProcessor addProcessor(ProcessorInterface processor) {
  7. this.processorList.add(processor);
  8. return this;
  9. }
  10. @Override
  11. public void process(Bitmap bitmap) {
  12. for (int i = 0; i < processorList.size(); i++) {
  13. processorList.get(i).process(bitmap);
  14. }
  15. }
  16. }

这样的话,不同的处理效果就可以放到不同的类中去实现,做到相互独立。这里给出一个ProcessorInterface的实现

  1. public class OpusTypeProcessor implements ProcessorInterface {
  2. private Paint paint;
  3. private Context mContext;
  4. public OpusTypeProcessor(Context mContext) {
  5. this.mContext = mContext.getApplicationContext();
  6. paint = new Paint();
  7. }
  8. @Override
  9. public void process(Bitmap bitmap) {
  10. Canvas canvas = new Canvas(bitmap);
  11. //对bitmap进行处理
  12. canvas.drawBitmap(bitmap,*,*,*,paint);
  13. }
  14. }

最后给出的是TuoFrescoProcessor的使用代码

  1. TuoFrescoProcessor processor = new TuoFrescoProcessor();
  2. //标识作品类型
  3. if (opusInfo.getOpusType() == TuoConstants.OPUS_TYPE.AUDIO || opusInfo.getOpusType() == TuoConstants.OPUS_TYPE.VIDEO) {
  4. OpusTypeProcessor opusTypeProcessor = new OpusTypeProcessor(context);
  5. opusTypeProcessor.setOpusType(opusInfo.getOpusType());
  6. processor.addProcessor(opusTypeProcessor);
  7. }
  8. //标识作品是否加精
  9. if (opusInfo.getIsFeatured()) {
  10. FeatureProcessor featureProcessor = new FeatureProcessor(context, FeatureProcessor.SOURCE_TYPE_GRID_GROUP);
  11. featureProcessor.setEnable(true);
  12. processor.addProcessor(featureProcessor);
  13. }
  14. //图片展示
  15. ImageRequest frescoRequest = ImageRequestBuilder.newBuilderWithSource(imagePath))
  16. .setPostprocessor(processor)
  17. .build();
  18. simpleDraweeView.setController(Fresco.newDraweeControllerBuilder()
  19. .setImageRequest(frescoRequest)
  20. .setOldController(simpleDraweeView.getController())
  21. .build());

其实七牛等文件服务器都提供了水印等功能,现在正在考虑将一部分图片处理交给七牛去做,这样的话客户端只要当做普通图片请求就可以了,可以减少客户端的性能压力。这部分还没有完成,稍后会有文章给出。

正文到此结束
Loading...