使用Fresco Processor处理图片
jopen
9年前
使用Fresco Processor处理图片
最近把蝌蚪音客的图片展现框架由Picasso切换到Fresco,因为Fresco使用的是公共内存区,所以切换之后的效果还是很明显的,之前app的内存占用在60MB左右,切换到Fresco后降低了将近一半。
因为蝌蚪音客用到了图片预处理功能,如下图:
为了减少dom个数,作品封面左下角的小图标是在图片展现时通过Bitmap绘制上去的。之前Picasso是用transform来处理,Fresco对应的功能是通过Processor来实现的。
感觉Fresco的这个功能没有Picasso封装的方便,Picasso的transform可以支持多个,这样的话如果一个图片需要处理多次,可以通过
Picasso.with(ctx).load(path).transform(new AudioTransform()).transform(new FeaturTransform()).into(imageView);
的方式来实现,但是Fresco不支持这种方式,所以这里对官方的Processor进行了封装
public interface ProcessorInterface { public void process(Bitmap bitmap); } public class TuoFrescoProcessor extends BaseRepeatedPostProcessor { private ArrayList<ProcessorInterface> processorList = new ArrayList<>(); public TuoFrescoProcessor addProcessor(ProcessorInterface processor) { this.processorList.add(processor); return this; } @Override public void process(Bitmap bitmap) { for (int i = 0; i < processorList.size(); i++) { processorList.get(i).process(bitmap); } } }
这样的话,不同的处理效果就可以放到不同的类中去实现,做到相互独立。
这里给出一个ProcessorInterface的实现
public class OpusTypeProcessor implements ProcessorInterface { private Paint paint; private Context mContext; public OpusTypeProcessor(Context mContext) { this.mContext = mContext.getApplicationContext(); paint = new Paint(); } @Override public void process(Bitmap bitmap) { Canvas canvas = new Canvas(bitmap); //对bitmap进行处理 canvas.drawBitmap(bitmap,*,*,*,paint); } }
最后给出的是TuoFrescoProcessor的使用代码
TuoFrescoProcessor processor = new TuoFrescoProcessor(); //标识作品类型 if (opusInfo.getOpusType() == TuoConstants.OPUS_TYPE.AUDIO || opusInfo.getOpusType() == TuoConstants.OPUS_TYPE.VIDEO) { OpusTypeProcessor opusTypeProcessor = new OpusTypeProcessor(context); opusTypeProcessor.setOpusType(opusInfo.getOpusType()); processor.addProcessor(opusTypeProcessor); } //标识作品是否加精 if (opusInfo.getIsFeatured()) { FeatureProcessor featureProcessor = new FeatureProcessor(context, FeatureProcessor.SOURCE_TYPE_GRID_GROUP); featureProcessor.setEnable(true); processor.addProcessor(featureProcessor); } //图片展示 ImageRequest frescoRequest = ImageRequestBuilder.newBuilderWithSource(imagePath)) .setPostprocessor(processor) .build(); simpleDraweeView.setController(Fresco.newDraweeControllerBuilder() .setImageRequest(frescoRequest) .setOldController(simpleDraweeView.getController()) .build());
其实七牛等文件服务器都提供了水印等功能,现在正在考虑将一部分图片处理交给七牛去做,这样的话客户端只要当做普通图片请求就可以了,可以减少客户端的性能压力。这部分还没有完成,稍后会有文章给出。
来自:https://www.zybuluo.com/lichangadd/note/141487