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
- Fresco进行图片的下载,高斯模糊
- 对图片进行高斯模糊处理的办法
- Android对图片进行高斯模糊
- 图片的高斯模糊
- 图片高斯模糊
- 图片高斯模糊
- 高斯图片模糊
- 使用GCD 多线程进行 图片高斯模糊渲染效果
- iOS 对图片进行高斯模糊(毛玻璃效果)
- 使用OpenCV进行图片模糊处理(高斯滤波器)
- Android用简洁的方法对图片进行高斯模糊
- android图片高斯模糊的方法
- IOS图片的高斯模糊
- 图片高斯模糊效果的实现
- android 图片的高斯模糊实现
- RenderScript-图片的高斯模糊
- Android实现图片的高斯模糊
- android使用方法---图片的高斯模糊
- Quartz cron表达式格式
- 百度地图开发的笔记(篇1)
- bzoj3672: [Noi2014]购票
- node中遇到的坑
- 美好的诗收集
- Fresco进行图片的下载,高斯模糊
- zurmo安装文档说明(windows)
- 理解MVC,MVP和MVVM设计模式
- HTML5之帆布(canvas)(四)
- ecplise安装离线的svn步骤
- Java中static关键字的作用
- c++11新特性之auto
- ARM嵌入式系统上OpenCL测试
- IO