- 浏览: 176070 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
柨灬柨:
:oops: [color=red][list]
[*]
不 ...
Socket通信总结 -
juren007:
你好,我最近遇到一个问题就是NIO下面缓冲区的分包,不知如何解 ...
解决TCP网络传输“粘包”问题 -
s170285:
<script>alert('1');</s ...
使用ViewHolder模式
方法1:按固定比例进行缩放
在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?
经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的
If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.
意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有保存在bitmap里面,而是保存在options里面),通过options.outHeight和 options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。
具体代码如下:
FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空
options.inJustDecodeBounds = false;
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = (int)(options.outHeight / (float)200);
if (be <= 0)
be = 1;
options.inSampleSize = be;
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
System.out.println(w+" "+h);
ImageView iv=new ImageView(this);
iv.setImageBitmap(bitmap);
这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:
File file=new File("/sdcard/feng.png");
try {
FileOutputStream out=new FileOutputStream(file);
if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,呵呵。
方法2:按长宽各自比例进行缩放
但是这里的缩放保存是按长宽比例的,下边也可以按固定大小缩放哦:
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
//缩放图片的尺寸
float scaleWidth = (float) sWidth / bmpWidth; //按固定大小缩放 sWidth 写多大就多大
float scaleHeight = (float) sHeight / bmpHeight; //
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);//产生缩放后的Bitmap对象
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);
bitmap.recycle();
Bitmap resizeBitmap = bitmap;
//Bitmap to byte[]
byte[] photoData = bitmap2Bytes(resizeBitmap);
//save file
String fileName = "/sdcard/test.jpg";
FileUtil.writeToFile(fileName, photoData);
在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?
经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的
If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.
意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有保存在bitmap里面,而是保存在options里面),通过options.outHeight和 options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。
具体代码如下:
FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空
options.inJustDecodeBounds = false;
//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可
int be = (int)(options.outHeight / (float)200);
if (be <= 0)
be = 1;
options.inSampleSize = be;
//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
System.out.println(w+" "+h);
ImageView iv=new ImageView(this);
iv.setImageBitmap(bitmap);
这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:
File file=new File("/sdcard/feng.png");
try {
FileOutputStream out=new FileOutputStream(file);
if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,呵呵。
方法2:按长宽各自比例进行缩放
但是这里的缩放保存是按长宽比例的,下边也可以按固定大小缩放哦:
int bmpWidth = bitmap.getWidth();
int bmpHeight = bitmap.getHeight();
//缩放图片的尺寸
float scaleWidth = (float) sWidth / bmpWidth; //按固定大小缩放 sWidth 写多大就多大
float scaleHeight = (float) sHeight / bmpHeight; //
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);//产生缩放后的Bitmap对象
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);
bitmap.recycle();
Bitmap resizeBitmap = bitmap;
//Bitmap to byte[]
byte[] photoData = bitmap2Bytes(resizeBitmap);
//save file
String fileName = "/sdcard/test.jpg";
FileUtil.writeToFile(fileName, photoData);
发表评论
-
[Android][Activity] onCreate, onSaveInstanceState和onRestoreInstanceState的调用探讨
2011-12-08 16:19 2887(转)http://blog.csdn.net/leewind ... -
android XML转义字符
2011-11-24 19:10 1905在XML中写字符串时,可能需要在字符串后面加空格,A_B(中间 ... -
EditText添加失去焦点事件
2011-11-21 20:29 29008有这样的情况,就是文本框(EditText)会随着某个Butt ... -
Activity(Intent)回传数据详解 startActivityForResult()
2011-11-20 12:04 9423startActivityForResult()的用法其实很简 ... -
Intent用法示例
2011-11-12 17:20 1807Intent用法实例 1.无参数Activity跳转 In ... -
andriod优秀开源项目
2011-10-19 16:56 1750FBReaderJ FBReaderJ用于Android平台 ... -
Android 应用程序版本
2011-10-19 16:25 814在应用程序的 升级/维护 策略中, 版本是一个关键的组成部分. ... -
[Android UI界面] 连续点击Button,弹出多个Dialog
2011-10-18 19:13 4603首先,你要定义一个全局的Dialog。然后,在点击时间里面判断 ... -
Android webview总结
2011-10-13 14:59 924总结 1.添加权限:AndroidManifest.xml 中 ... -
Android获取IMEI码
2011-10-11 00:07 1606相比大家都知道,每部手机都有一个属于自己的字符串,这个字符串是 ... -
使用Timer定时改变view控件的状态
2011-10-10 22:52 1247//1.声明timer private Timer mTim ... -
Android xml风格和主题
2011-10-08 19:23 962(转)http://www.cnblogs.c ... -
使用全局变量
2011-10-07 10:20 1195如想在整个应用中使用,在java中一般是使用静态变量,而在an ... -
android定义数组
2011-09-09 09:42 13195在android中创建数组,直接定义xml文件即可以。 (1 ... -
Android工程各文件夹结构的含义及使用
2011-09-08 11:06 12397对Android这些东西一开始 ... -
Android解析XML的方式
2011-09-08 10:46 3512android解析xml文件的方式 ... -
android框架
2011-09-07 17:48 678读了高焕堂的书,觉得不错。选点自以为重要的知识,放在这里 ... -
android常识
2011-09-07 15:45 7851.mnt/sdcard和sdcard的区别 其实mnt/sd ... -
使用ViewHolder模式
2011-08-31 14:30 10558ViewHolder不是Android的开发API,而是一种设 ... -
Android SimpleAdapter
2011-08-30 12:28 2292对别人的代码改了一下,主要针对SimpleAdapter做一个 ...
相关推荐
这个名为"Android-一个Android图片缩放查看控件支持手势"的项目,旨在提供一个自定义的视图控件,它允许用户通过手势进行图片的放大、缩小以及平移操作,提升用户体验。下面我们将深入探讨这个控件的关键知识点和...
总之,Android图片缩放涉及到多个技术点,包括Bitmap操作、ImageView的使用、手势识别、异步处理和性能优化。"ImageScale"这个示例项目为我们提供了一个实践这些概念的平台,通过学习和理解这个项目,开发者可以更好...
在实现图片缩放和滑动时,我们需要利用这一点来确保流畅的用户体验。 1. **SurfaceView的创建与初始化**: 在布局文件中添加SurfaceView,并在Activity的onCreate()方法中找到并初始化它。设置SurfaceHolder的回调...
这个"android图片缩放、放大demo"可能是提供了一个实际的项目实例,用于展示如何在Android应用程序中实现图片的动态调整大小。让我们深入探讨一下Android图片缩放放大的关键知识点。 1. **ImageView组件**: ...
在Android开发中,图片缩放是一项常见的需求,特别是在ImageView组件中展示大图时,用户可能需要通过手势来放大或缩小图片以查看细节。本篇将详细介绍如何在Android中实现图片的缩放功能,特别是利用ImageView结合...
本文将深入探讨如何在Android中实现ImageView的图片缩放功能,同时结合异步加载和Activity的半透明效果,提升用户体验。 首先,我们要理解Android中ImageView的基本用法。ImageView可以设置为固定大小或根据图片...
在Android开发中,实现图片的缩放、双击旋转以及拖动展示是一项常见的需求,尤其在设计用户界面或开发图像处理应用时。本教程将详细讲解如何在Android中实现这样的功能,主要涉及以下几个核心知识点: 1. **...
这个"Android图片缩放动画Demo"正是为了实现这样的功能而设计的。下面将详细解释其中涉及的关键知识点: 1. **ImageView的使用**: - `ImageView`是Android中展示图片的基础组件,可以加载本地或网络资源的图片。 ...
Android中进行图片缩放显示,获取网络图片,双击放大缩小,支持多点触屏缩放和拖拽。 demo查看地址:http://blog.csdn.net/u011084603/article/details/50371843
在Android应用开发中,"PhotoView android 图片缩放浏览器"是一个专为查看和浏览图片设计的组件,它提供了丰富的交互功能,如手势缩放、平移等,提升了用户体验。这个项目主要依赖了三个核心组件和技术:Android-...
android图片缩放源码,绝对好用,可以当类库使用
1. **矩阵缩放**:Android中最基本的图片缩放方法是通过`Matrix`类,调整其`ScaleX`和`ScaleY`属性来改变图片大小。 2. **Bitmap.createScaledBitmap()**:这个静态方法可以创建一个新的Bitmap,根据指定的宽度和...
图片缩放的核心算法通常是基于矩阵变换的。在Android中,`Matrix`类提供了对2D图像的旋转、平移、缩放等操作。在`ScaleView`中,我们可以使用`Matrix.postScale()`方法来改变图片的缩放比例。 #### 2.3 平滑滚动和...
在Android开发中,图片缩放和多点触控缩放是一项常见的需求,特别是在设计用户界面时,例如在ImageView中展示图像。本节将详细讲解如何实现Android中的图片自由缩放,以及支持多点触控的缩放功能。 一、图片缩放...
在Android开发中,实现图片浏览的全屏缩放效果是一项常见的需求,特别是在社交应用中,如QQ好友动态和微信朋友圈。这种功能不仅需要提供良好的用户体验,还需要考虑性能和内存优化,因为图片通常较大,处理不当可能...
总之,Android图片裁剪涉及多个方面,包括图像处理、手势识别和UI交互。通过掌握这些技术,开发者能够创建功能丰富的图片编辑应用,提升用户体验。在实际开发中,还需要考虑性能优化和兼容性问题,以确保应用在不同...
Android实现图片手势缩放、移动、双击放大缩小。
在Android开发中,实现图片的双指缩放和单指拖拽是常见的需求,尤其在设计用户界面或者创建自定义视图时。这种功能能够提供更丰富的交互体验,让用户能够自由地查看和操作图片。本篇文章将深入探讨如何在Android应用...
本项目提供的"Android高仿QQ空间图片缩放源码"专注于实现平滑、高效的图片查看体验,旨在帮助开发者理解和实现高质量的图片浏览功能。 首先,我们关注的核心技术是图片的加载和缓存机制。在Android中,内存限制是一...