Fresco进行图片的下载,高斯模糊

来源:互联网 发布:大数据平台基础设施 编辑:程序博客网 时间:2024/06/05 23:41

我的项目地址:请点击这里

这里写图片描述
使用fresco进行图片的预下载,下载转存,以及对图片进行高斯模糊
activity:

package com.fanyafeng.frescopicload.activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.net.Uri;import android.os.Bundle;import android.support.design.widget.FloatingActionButton;import android.support.design.widget.Snackbar;import android.support.v4.app.NotificationCompat;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.ImageView;import com.commit451.nativestackblur.NativeStackBlur;import com.facebook.common.executors.CallerThreadExecutor;import com.facebook.common.executors.UiThreadImmediateExecutorService;import com.facebook.common.references.CloseableReference;import com.facebook.datasource.BaseDataSubscriber;import com.facebook.datasource.DataSource;import com.facebook.datasource.DataSubscriber;import com.facebook.drawee.backends.pipeline.Fresco;import com.facebook.drawee.view.SimpleDraweeView;import com.facebook.imagepipeline.common.ImageDecodeOptions;import com.facebook.imagepipeline.common.ResizeOptions;import com.facebook.imagepipeline.core.ImagePipeline;import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;import com.facebook.imagepipeline.image.CloseableImage;import com.facebook.imagepipeline.image.CloseableStaticBitmap;import com.facebook.imagepipeline.request.ImageRequest;import com.facebook.imagepipeline.request.ImageRequestBuilder;import com.fanyafeng.frescopicload.R;import com.fanyafeng.frescopicload.BaseActivity;import com.fanyafeng.frescopicload.util.FrescoDealPicUtil;import java.util.concurrent.Executor;//需要搭配baseactivity,这里默认为baseactivity,并且默认Baseactivity为包名的根目录public class DownPicActivity extends BaseActivity {    private SimpleDraweeView sdvDown1;    private ImageView ivDown1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_down_pic);//这里默认使用的是toolbar的左上角标题,如果需要使用的标题为中心的采用下方注释的代码,将此注释掉即可        title = getString(R.string.title_activity_down_pic);        initView();        initData();    }    @Override    protected void onResume() {        super.onResume();        //toolbar_center_title.setText(getString(R.string.title_activity_down_pic));    }    //初始化UI空间    private void initView() {        sdvDown1 = (SimpleDraweeView) findViewById(R.id.sdvDown1);        ivDown1 = (ImageView) findViewById(R.id.ivDown1);    }    //初始化数据    private void initData() {    }    private void senNotifi(Bitmap bitmap) {        int id = (int) (System.currentTimeMillis() / 1000);        Intent intent = new Intent(this, DialogActivity.class);        PendingIntent contentIntent = PendingIntent.getActivity(this, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);        NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);        builder.setContentTitle(title)                .setContentText("消息详细内容嘻嘻嘻嘻嘻嘻嘻嘻嘻")                .setContentIntent(contentIntent)                .setTicker(this.getString(R.string.app_name) + "消息")                .setWhen(System.currentTimeMillis())                .setPriority(Notification.PRIORITY_DEFAULT)                .setOngoing(false)                .setDefaults(Notification.DEFAULT_VIBRATE)                .setSmallIcon(R.drawable.icon_progress_bar)//                .setLargeIcon(BitmapFactory.decodeResource(this.getResources(),//                        R.mipmap.ic_launcher));                .setLargeIcon(bitmap);        Notification notification = builder.build();        notification.flags = Notification.FLAG_AUTO_CANCEL;        notificationManager.notify(id, notification);    }    @Override    public void onClick(View v) {        super.onClick(v);        switch (v.getId()) {            case R.id.btnDownPic1:                downPic();                break;            case R.id.btnShowPic1:                break;            case R.id.btnNoti1://                senNotifi();                break;        }    }    private void downPic() {        Uri uri = Uri.parse("http://tiyanzhimei.com/wp-content/uploads/2015/08/121.jpg");        ImageDecodeOptions decodeOptions = ImageDecodeOptions.newBuilder()                .setBackgroundColor(Color.GRAY)                .build();        ImageRequest imageRequest = ImageRequestBuilder                .newBuilderWithSource(uri)                .setImageDecodeOptions(decodeOptions)                .setAutoRotateEnabled(true)                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)                .setProgressiveRenderingEnabled(true)//渐进渲染//                .setResizeOptions(new ResizeOptions(300, 300))                .build();        ImagePipeline imagePipeline = Fresco.getImagePipeline();        DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, this);        dataSource.subscribe(new BaseBitmapDataSubscriber() {            @Override            protected void onNewResultImpl(Bitmap bitmap) {                //获取图片的bitmap                Log.d("down", "down在bitmap做了点啥" + (bitmap == null));//                sdvDown1.setImageBitmap(bitmap);                sdvDown1.setImageBitmap(fastBlur(bitmap, 10, 2));                ivDown1.setImageBitmap(bitmap);                senNotifi(bitmap);            }            @Override            protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {            }        }, UiThreadImmediateExecutorService.getInstance());//        try {//            CloseableReference<CloseableImage> imageCloseableReference = dataSource.getResult();//            if (imageCloseableReference != null) {//                try {//                    CloseableImage closeableImage = imageCloseableReference.get();//                    if (closeableImage != null && closeableImage instanceof CloseableStaticBitmap) {//                        CloseableStaticBitmap closeableStaticBitmap = (CloseableStaticBitmap) closeableImage;//                        Bitmap bitmap = closeableStaticBitmap.getUnderlyingBitmap();//                        if (bitmap != null) {//                            sdvDown1.setImageBitmap(bitmap);//                        }//                    }//                } finally {//                    CloseableReference.closeSafely(imageCloseableReference);//                }//            } else {////            }//        } catch (Exception e) {//            e.printStackTrace();//        } finally {//            dataSource.close();//        }    }    private Bitmap fastBlur(Bitmap bkg, int radius, int downSampling) {        if (downSampling < 2) {            downSampling = 2;        }        Bitmap smallBitmap = Bitmap.createScaledBitmap(bkg, bkg.getWidth() / downSampling, bkg.getHeight() / downSampling, true);        return NativeStackBlur.process(smallBitmap, radius);    }}

fresco下载图片是异步的,但是有时候是需要知道图片什么时候下载完成,然后对图片进行相应的处理,这时就需要同步了,以上代码都加了详细的注释,退图片的一些处理都是基于bitmap进行的。再上一个工具类,工具类里面注释也很详细

package com.fanyafeng.frescopicload.util;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.net.Uri;import com.commit451.nativestackblur.NativeStackBlur;import com.facebook.binaryresource.FileBinaryResource;import com.facebook.cache.common.SimpleCacheKey;import com.facebook.common.executors.UiThreadImmediateExecutorService;import com.facebook.common.references.CloseableReference;import com.facebook.datasource.DataSource;import com.facebook.drawee.backends.pipeline.Fresco;import com.facebook.drawee.backends.pipeline.PipelineDraweeController;import com.facebook.drawee.controller.BaseControllerListener;import com.facebook.drawee.interfaces.DraweeController;import com.facebook.drawee.view.SimpleDraweeView;import com.facebook.imagepipeline.bitmaps.PlatformBitmapFactory;import com.facebook.imagepipeline.common.ImageDecodeOptions;import com.facebook.imagepipeline.common.ResizeOptions;import com.facebook.imagepipeline.core.ImagePipeline;import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;import com.facebook.imagepipeline.image.CloseableImage;import com.facebook.imagepipeline.image.ImageInfo;import com.facebook.imagepipeline.request.BasePostprocessor;import com.facebook.imagepipeline.request.ImageRequest;import com.facebook.imagepipeline.request.ImageRequestBuilder;import com.facebook.imagepipeline.request.Postprocessor;import com.fanyafeng.frescopicload.R;import com.fanyafeng.frescopicload.constant.PicUrlConstants;import com.fanyafeng.frescopicload.util.BlurUtil.BlurPostprocessor;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;/** * Author: fanyafeng * Data: 16/7/28 10:57 * Email: fanyafeng@live.cn */public class FrescoDealPicUtil {    /**     * 裁剪图片     *     * @param simpleDraweeView     * @param picUrl     * @param showWidth,需要显示的图片的宽度     * @param showHeight,需要显示图片的高度     * @param cutWidth,裁剪图片的宽的起点     * @param cutHeight,裁剪图片高的起点     */    public static void getCutedPic(SimpleDraweeView simpleDraweeView, String picUrl, final int showWidth, final int showHeight, final int cutWidth, final int cutHeight) {        Postprocessor postprocessor = new BasePostprocessor() {            @Override            public CloseableReference<Bitmap> process(Bitmap sourceBitmap, PlatformBitmapFactory bitmapFactory) {                CloseableReference<Bitmap> bitmapRef = bitmapFactory.createBitmap(                        showWidth,                        showHeight);                int aimWidth = sourceBitmap.getWidth() - cutWidth;                int aimHeight = sourceBitmap.getHeight() - cutHeight;                try {                    Bitmap destBitmap = bitmapRef.get();                    for (int x = 0; x < showWidth; x++) {                        for (int y = 0; y < showHeight; y++) {                            destBitmap.setPixel(x, y, sourceBitmap.getPixel(aimWidth + x, aimHeight + y));                        }                    }                    return CloseableReference.cloneOrNull(bitmapRef);                } finally {                    CloseableReference.closeSafely(bitmapRef);                }            }        };        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(picUrl))                .setPostprocessor(postprocessor)                .build();        PipelineDraweeController pipelineDraweeController = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()                .setImageRequest(imageRequest)                .setOldController(simpleDraweeView.getController())                .setTapToRetryEnabled(true)//点击重试                .build();        simpleDraweeView.setController(pipelineDraweeController);    }    /**     * 图片加水印(字)     *     * @param simpleDraweeView     * @param imgUrl     * @param mark             需要加的水印,限制为字     * @param color            水印字体颜色     * @param alpha            水印透明度     */    public static void setTextWaterMark(SimpleDraweeView simpleDraweeView, String imgUrl, final String mark, final int color, final int alpha) {        Postprocessor postprocessor = new BasePostprocessor() {            @Override            public void process(Bitmap bitmap) {                super.process(bitmap);                int width = bitmap.getWidth();                int height = bitmap.getHeight();                Canvas canvas = new Canvas(bitmap);                Paint paint = new Paint();                paint.setStrokeWidth(10);                String familyName = "楷体";                Typeface font = Typeface.create(familyName, Typeface.BOLD);                paint.setColor(color);                paint.setTypeface(font);                paint.setTextSize(60);                paint.setAlpha(alpha);                Rect rect = new Rect();                paint.getTextBounds(mark, 0, mark.length(), rect);                int textWidth = rect.width();                canvas.drawText(mark, width - textWidth - 50, height - 50, paint);            }        };        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imgUrl))                .setPostprocessor(postprocessor)                .build();        PipelineDraweeController pipelineDraweeController = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()                .setImageRequest(imageRequest)                .setOldController(simpleDraweeView.getController())                .build();        simpleDraweeView.setController(pipelineDraweeController);    }    /**     * 图片加水印(图)     *     * @param context     * @param simpleDraweeView     * @param picUrl     * @param picId            水印图的id     */    public static void setPicWaterMark(final Context context, SimpleDraweeView simpleDraweeView, String picUrl, final int picId) {        Postprocessor postprocessor = new BasePostprocessor() {            @Override            public void process(Bitmap bitmap) {                super.process(bitmap);                int width = bitmap.getWidth();                int height = bitmap.getHeight();                Canvas canvas = new Canvas(bitmap);                Paint paint = new Paint();                paint.setAlpha(255);                Bitmap bitma = BitmapFactory.decodeResource(context.getResources(), picId);                int markWidth = bitma.getWidth();                canvas.drawBitmap(bitma, width - markWidth - 50, 50, paint);            }        };        ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(Uri.parse(picUrl))                .setPostprocessor(postprocessor)                .build();        PipelineDraweeController pipelineDraweeController = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()                .setImageRequest(imageRequest)                .setOldController(simpleDraweeView.getController())                .build();        simpleDraweeView.setController(pipelineDraweeController);    }    /**     * resize 图片     *     * @param uri     * @param draweeView     */    public static void showThumb(Uri uri, SimpleDraweeView draweeView) {        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)//                .setResizeOptions(new ResizeOptions(.dip2px(144), DensityUtil.dip2px(144)))                .build();        DraweeController controller = Fresco.newDraweeControllerBuilder()                .setImageRequest(request)                .setOldController(draweeView.getController())                .setControllerListener(new BaseControllerListener<ImageInfo>())                .build();        draweeView.setController(controller);    }    /**     * 异步     *     * @param context     * @param picUrl     * @return     */    public static Bitmap getBitmap(Context context, String picUrl) {        final Bitmap[] bitMap = {null};        Uri uri = Uri.parse(picUrl);        ImageDecodeOptions decodeOptions = ImageDecodeOptions.newBuilder()                .setBackgroundColor(Color.GRAY)                .build();        ImageRequest imageRequest = ImageRequestBuilder                .newBuilderWithSource(uri)                .setImageDecodeOptions(decodeOptions)                .setAutoRotateEnabled(true)                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)                .setProgressiveRenderingEnabled(false)//                .setResizeOptions()                .build();        ImagePipeline imagePipeline = Fresco.getImagePipeline();        DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);        dataSource.subscribe(new BaseBitmapDataSubscriber() {            @Override            protected void onNewResultImpl(Bitmap bitmap) {                bitMap[0] = bitmap;            }            @Override            protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {            }        }, UiThreadImmediateExecutorService.getInstance());        return bitMap[0];    }    private static void download(Context context, String url) {        ImageRequest request = ImageRequestBuilder.                newBuilderWithSource(Uri.parse(url))                .setAutoRotateEnabled(true)                .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)                .setProgressiveRenderingEnabled(false)                .build();        ImagePipeline imagePipeline = Fresco.getImagePipeline();        imagePipeline.prefetchToDiskCache(request, context);    }    /**     * 图片拷贝     *     * @param imgUrl     * @param newPath     * @param fileName     * @return     */    public static boolean copyPicFile(String imgUrl, String newPath, String fileName) {        FileBinaryResource fileBinaryResource = (FileBinaryResource) Fresco.getImagePipelineFactory()                .getMainFileCache().getResource(new SimpleCacheKey(imgUrl));        if (fileBinaryResource == null) {            return false;        }        File oldfile = fileBinaryResource.getFile();        boolean isok = true;        try {            int bytesum = 0;            int byteread = 0;            if (oldfile.exists()) { //文件存在时                InputStream inStream = new FileInputStream(oldfile); //读入原文件                if (!new File(newPath).exists()) {                    new File(newPath).mkdirs();                }                String myPath = newPath + File.separator + fileName;                FileOutputStream fs = new FileOutputStream(myPath);                byte[] buffer = new byte[1024];                int length;                while ((byteread = inStream.read(buffer)) != -1) {                    bytesum += byteread; //字节数 文件大小                    fs.write(buffer, 0, byteread);                }                fs.flush();                fs.close();                inStream.close();            } else {                isok = false;            }        } catch (Exception e) {            isok = false;        }        return isok;    }    public static void loadUrlInBlur(String url, SimpleDraweeView draweeView,                                     int width, int height, Context context, int radius, int sampling) {        if (sampling < 2) {            sampling = 2;        }        loadUrl(url, draweeView, new BlurPostprocessor(context, radius, 1), width / sampling, height / sampling, null);    }    public static void loadUrl(String url, SimpleDraweeView draweeView, BasePostprocessor processor, int width, int height,                               BaseControllerListener listener) {        load(Uri.parse(url), draweeView, processor, width, height, listener);    }    public static void load(Uri uri, SimpleDraweeView draweeView, BasePostprocessor processor, int width, int height,                            BaseControllerListener listener) {        ResizeOptions resizeOptions = null;        if (width > 0 && height > 0) {            resizeOptions = new ResizeOptions(width, height);        }        ImageRequest request =                ImageRequestBuilder.newBuilderWithSource(uri)                        .setPostprocessor(processor)//                        .setResizeOptions(resizeOptions)                        //缩放,在解码前修改内存中的图片大小, 配合Downsampling可以处理所有图片,否则只能处理jpg,                        // 开启Downsampling:在初始化时设置.setDownsampleEnabled(true)                        .setProgressiveRenderingEnabled(true)//支持图片渐进式加载                        .setAutoRotateEnabled(true) //如果图片是侧着,可以自动旋转                        .build();        PipelineDraweeController controller =                (PipelineDraweeController) Fresco.newDraweeControllerBuilder()                        .setImageRequest(request)                        .setControllerListener(listener)                        .setOldController(draweeView.getController())                        .setAutoPlayAnimations(true) //自动播放gif动画                        .build();        draweeView.setController(controller);    }    private Bitmap fastBlur(Bitmap bkg, int radius, int downSampling) {        if (downSampling < 2) {            downSampling = 2;        }        Bitmap smallBitmap = Bitmap.createScaledBitmap(bkg, bkg.getWidth() / downSampling, bkg.getHeight() / downSampling, true);        return NativeStackBlur.process(smallBitmap, radius);    }}
0 0