使用Fresco Processor處理圖片

jopen 9年前發布 | 43K 次閱讀 Fresco Android開發 移動開發

使用Fresco Processor處理圖片


最近把蝌蚪音客的圖片展現框架由Picasso切換到Fresco,因為Fresco使用的是公共內存區,所以切換之后的效果還是很明顯的,之前app的內存占用在60MB左右,切換到Fresco后降低了將近一半。

因為蝌蚪音客用到了圖片預處理功能,如下圖:
cmd-markdown-logo cmd-markdown-logo
為了減少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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!