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

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

这里写图片描述
使用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);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值