急求android系统图库的图片放大操作的实现啊
我需要实现的功能是对一张图片进行放大和缩小的操作。我现在想加载一张分辨率很大的图片,如果直接加载进内存,一般都会内存溢出,所以一般都需要对图片进行缩小的操作,使图像能显示在屏幕上就行。然后我使用Matrix对图像进行放大操作,这时候问题来了,怎样将图片放大了还能保证图像的质量,并且不会内存溢出呢?
这个问题弄了好久了,也没找到答案,网上有人说对图片进行局部解析,也没弄明白。最后我想了下,这就是系统图库带有的功能,所以有知道这方面的朋友麻烦告知下啊,谢谢了! --------------------编程问答-------------------- 楼主要的是不是这种功能。。。
--------------------编程问答-------------------- 图片的局部解析不是很难,网上也有很多例子。还有,我不记得系统图片都有什么功能,但是我知道android系统图库是有源代码的,如果有你要的功能可以参考一下源代码。 --------------------编程问答--------------------
http://blog.csdn.net/guolin_blog/article/details/11100327
这篇文章的功能基本实现了,主要是要实现放大图片,保证图片质量并不能OOM的功能 --------------------编程问答-------------------- 你把图片放到一个固定大小的layout里。设置图片的模式为fix:
imageView.setScaleType(ImageView.ScaleType.FIT_XY);--------------------编程问答--------------------
楼主仔细看看,他那个缩放不是decode的,所以不会oom的 --------------------编程问答--------------------
你把图片放到一个固定大小的layout里。设置图片的模式为fix:imageView.setScaleType(ImageView.ScaleType.FIT_XY);
这样图片会变形嘛 也不能解决我的问题 --------------------编程问答--------------------
你把图片放到一个固定大小的layout里。设置图片的模式为fix:imageView.setScaleType(ImageView.ScaleType.FIT_XY);
这样图片会变形嘛 也不能解决我的问题
你获取下小图片的宽高比例,动态设置嘛,保持宽高比不变就不会变形 --------------------编程问答--------------------
楼主要的是不是这种功能。。。
http://blog.csdn.net/guolin_blog/article/details/11100327
这篇文章的功能基本实现了,主要是要实现放大图片,保证图片质量并不能OOM的功能
楼主仔细看看,他那个缩放不是decode的,所以不会oom的
我用了一张近4000*4000分辨率的图片还是内存溢出了 --------------------编程问答-------------------- 那肯定不行,4000 * 4000 decode出来有多少m了
很大很大了。4000 * 4000 要先进行缩放处理才行。。。 --------------------编程问答--------------------
那肯定不行,4000 * 4000 decode出来有多少m了
很大很大了。4000 * 4000 要先进行缩放处理才行。。。
对啊,就是要缩放,但是我就是想放大的时候能够保证质量,不知道怎么实现了。另外,如果放大到原图大小,那不还是会OOM吗? --------------------编程问答--------------------
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
只能先缩放变小,要不然decode只能是oom,然后放大再用那个方法。。。 --------------------编程问答--------------------
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
只能先缩放变小,要不然decode只能是oom,然后放大再用那个方法。。。
那放大的时候要保证图像精度的话,要怎么办呢? --------------------编程问答--------------------
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
只能先缩放变小,要不然decode只能是oom,然后放大再用那个方法。。。
那放大的时候要保证图像精度的话,要怎么办呢?
那没办法了。。。
补充:移动开发 , Android