android studio 常用图片处理,大量加载图片的内存处理,压缩等等
图片缓存 这个比较特殊
//图片存储
private void saveBitmapToSharedPreferences(Bitmap bitmap){
// Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);
//第二步:利用Base64将字节数组输出流中的数据转换成字符串String
byte[] byteArray=byteArrayOutputStream.toByteArray();
String imageString=new String(Base64.encodeToString(byteArray, Base64.DEFAULT));
//第三步:将String保持至SharedPreferences
SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);
SharedPreferences.Editor editor=sharedPreferences.edit();
editor.putString("image", imageString);
editor.commit();
}
// 拿 图片缓存
private void getBitmapFromSharedPreferences(){
SharedPreferences sharedPreferences= getSharedPreferences("testSP", Context.MODE_PRIVATE);
//第一步:取出字符串形式的Bitmap
String imageString=sharedPreferences.getString("image", "");
//第二步:利用Base64将字符串转换为ByteArrayInputStream
byte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(byteArray);
//第三步:利用ByteArrayInputStream生成Bitmap
Bitmap bitmap=BitmapFactory.decodeStream(byteArrayInputStream);
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.portrait);
}else{
ivHead.setImageBitmap(bitmap);
}
}
-----------------------我是分割线------------------------------
设置本地图片为bitmap
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
切换图片
messageImage.setImageResource(R.drawable.message_selected);
android 网络url转bitmap
注意:该方法必须要在子线程中调用,因为涉及网络请求
public Bitmap getBitmap(String url) {
Bitmap bm = null;
try {
URL iconUrl = new URL(url);
URLConnection conn = iconUrl.openConnection();
HttpURLConnection http = (HttpURLConnection) conn;
int length = http.getContentLength();
conn.connect();
// 获得图像的字符流
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is, length);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();// 关闭流
}
catch (Exception e) {
e.printStackTrace();
}
return bm;
}
-----------------------我是分割线------------------------------
imageView 常用属性设置
等比例缩放图片 重要
android:adjustViewBounds="true"
控制为了使图片适合 ImageView 的大小,应该如何变更图片大小或移动图片。一定是下列常量之一:
android:scaleType
常量值描述:
matrix
用矩阵来绘图
fitXY
拉伸图片(不按比例)以填充View的宽高
fitStart
按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的左边
fitCenter
按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的中间
fitEnd
按比例拉伸图片,拉伸后图片的高度为View的高度,且显示在View的右边
center
按原图大小显示图片,但图片宽高大于View的宽高时,截图图片中间部分显示
centerCrop
按比例放大原图直至等于某边View的宽高显示。
centerInside
当原图宽高或等于View的宽高时,按原图大小居中显示;反之将原图缩放至View的宽高居中显示。
(译者注:设置图片的填充方式。)
往下推的神技!
<ImageView
android:paddingBottom="140dp"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@drawable/huck" />
-----------------------我是分割线------------------------------
下面介绍一个常用的图片加载库Glide,可以极大的优化加载的内存,而且合并处理狠很多东西,同时加载图片越多,越能体现价值,可以在android里面看到内存的波动情况
Glide 的一个优势:缓存
Glide 的缓存实现是基于 Picasso,当加载图片时,Glide 使用3个来源:内存,磁盘和网络(从最快到最慢排序)。 他还可以加载动态图片
glide 在程序入口里面 有一个初始化配置 配置了他的话 就可以不用做缓存操作之类的
使用要先导包
compile 'com.github.bumptech.glide:glide:+'
加载网络图片
ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
String internetUrl = "http://i.imgur.com/DvpvklR.png";
Glide .with(context)
.load(internetUrl)
.into(targetImageView);
// 加载本地图片
File file = new File(getExternalCacheDir() + "/image.jpg");
Glide.with(this).load(file).into(imageView);
// 加载应用资源
int resource = R.drawable.image;
Glide.with(this).load(resource).into(imageView);
// 加载二进制流
byte[] image = getImageBytes();
Glide.with(this).load(image).into(imageView);
// 加载Uri对象
Uri imageUri = getImageUri();
Glide.with(this).load(imageUri).into(imageView);
更多设置用法
.placeholder(R.drawable.loading) // 站位图
.error(R.drawable.error)加载图片失败时显示的图片
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
这里在load()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。
Glide.with(this)
.load(url)
.asBitmap()
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
这里调用了asGif()方法替代了asBitmap()方法, 强制动态图片
Glide.with(this)
.load(url)
.asGif()
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
//这个文件可能不存在于你的设备中。然而你可以用任何文件路径,去指定一个图片路径。
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Running.jpg");
Glide .with(context) .load(file) .into(imageViewFile);
占位符和渐现动画
Glide 的流式接口只需要调用 .placeHolder()用一个 drawable(resource) 引用,Glide 将会显示它作为一个占位符,直到你的实际图片准备好。
Glide
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.placeholder(R.mipmap.ic_launcher) // 也可以是一个drawable
.into(imageViewPlaceholder);
Glide
.with(context)
.load("http://futurestud.io/non_existing_image.png")
.placeholder(R.mipmap.ic_launcher) // 也可以是一个drawable
.error(R.mipmap.future_studio_launcher) // 如果图片不能加载就会显示
.into(imageViewError);
Glide
.with(context)
.load(UsageExampleListViewAdapter.eatFoodyImages[0])
.override(600, 200) // 重新改变图片大小成这些尺寸(像素).不关心长宽比
.into(imageViewResize);
Glide.with(this)
.load(url)
.placeholder(R.drawable.loading)
.error(R.drawable.error)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(100, 100) //设置图片大小 并非是view大小
.into(imageView);
/**设置实体图片 加缓存 待测试*/
Glide.with(context)
.load(file)
.diskCacheStrategy(DiskCacheStrategy.NONE)// 缓存所有尺寸的图片
.into(holder.img1);
显示 Gif
检查图片加载的是否是一个gif图片,调用一个额外的防区强制 Glide变成一个 Gif asGif()
String gifUrl = "http://i.kinja-img.com/gawker-media/image/upload/s--B7tUiM5l--/gf2r69yorbdesguga10i.gif";
Glide
.with( context )
.load( gifUrl )
.asGif()
.error( R.drawable.full_cake )
.into( imageViewGif );