- 浏览: 571724 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
BitMap代表一张位图,扩展名可以是.bmp或者.dib。
位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。
例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB
位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。
jpg格式则恰好弥补了位图文件这个缺点。
Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。
一、Bitmap的生成
1.1 BitmapFactory decode出Bitmap
Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。
利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。
1.2 decode时的选项
在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options。
利用Options的下列属性,可以指定decode的选项:
1.inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
2.inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
3.inSampleSize 设置decode时的缩放比例。
利用Options的这些值就可以高效的得到一幅缩略图。
先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];
利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。
先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。
二、利用Bitmap和Matrix实现图像变换
Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。
用源Bitmap通过变换生成新的Bitmap的方法:
第一个方法是最终的实现,后两种只是对第一种方法的封装。
第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;
第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。
设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。
三、保存图像文件
经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。
这个操作过程中,Bitmap.compress()方法的参数format可设置JPEG或PNG格式;
quality可选择压缩质量;
fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。
从资源文件中获取
从SD卡中得到图片
由于前面创建的Bitmap所占用的内存还没有回收,而导致引发OutOfMemory错误,所以用下面方法判断是否回收。
按新图片高宽进行压缩
设置图片的圆角,返回设置后的BitMap
总结一下,本文介绍Bitmap的使用方法——用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。
转自:http://www.open-open.com/lib/view/open1333418945202.html
位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。
例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB
位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。
jpg格式则恰好弥补了位图文件这个缺点。
Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。
一、Bitmap的生成
1.1 BitmapFactory decode出Bitmap
Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。
利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。
1.2 decode时的选项
在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options。
利用Options的下列属性,可以指定decode的选项:
1.inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
2.inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
3.inSampleSize 设置decode时的缩放比例。
利用Options的这些值就可以高效的得到一幅缩略图。
先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];
利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。
先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。
二、利用Bitmap和Matrix实现图像变换
Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。
用源Bitmap通过变换生成新的Bitmap的方法:
public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,Matrix m, boolean filter) public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height) public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight,boolean filter)
第一个方法是最终的实现,后两种只是对第一种方法的封装。
第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;
第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。
设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。
三、保存图像文件
//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0 bitmap.compress(Bitmap.CompressFormat.JPEG, 30, outputstream);
经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。
这个操作过程中,Bitmap.compress()方法的参数format可设置JPEG或PNG格式;
quality可选择压缩质量;
fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。
从资源文件中获取
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img1);
从SD卡中得到图片
(方法1) String SDCarePath=Environment.getExternalStorageDirectory().toString(); String filePath=SDCarePath+"/"+"haha.jpg"; Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); (方法2) InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream);
由于前面创建的Bitmap所占用的内存还没有回收,而导致引发OutOfMemory错误,所以用下面方法判断是否回收。
if(!bitmap.isRecycled()) { bitmap.recycle() }
按新图片高宽进行压缩
//得到图片原始的高宽 int rawHeight = rawBitmap.getHeight(); int rawWidth = rawBitmap.getWidth(); // 设定图片新的高宽 int newHeight = 500; int newWidth = 500; // 计算缩放因子 float heightScale = ((float) newHeight) / rawHeight; float widthScale = ((float) newWidth) / rawWidth; // 新建立矩阵 Matrix matrix = new Matrix(); matrix.postScale(heightScale, widthScale); // 设置图片的旋转角度 // matrix.postRotate(-30); // 设置图片的倾斜 // matrix.postSkew(0.1f, 0.1f); // 将图片大小压缩 // 压缩后图片的宽和高以及kB大小均会变化 Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth, rawWidth, matrix, true);
设置图片的圆角,返回设置后的BitMap
public Bitmap toRoundCorner(Bitmap bitmap, int pixels) { Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(roundCornerBitmap); int color = 0xff424242;// int color = 0xff424242; Paint paint = new Paint(); paint.setColor(color); // 防止锯齿 paint.setAntiAlias(true); Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); RectF rectF = new RectF(rect); float roundPx = pixels; // 相当于清屏 canvas.drawARGB(0, 0, 0, 0); // 先画了一个带圆角的矩形 canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // 再把原来的bitmap画到现在的bitmap!!!注意这个理解 canvas.drawBitmap(bitmap, rect, rect, paint); return roundCornerBitmap; }
总结一下,本文介绍Bitmap的使用方法——用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。
转自:http://www.open-open.com/lib/view/open1333418945202.html
发表评论
文章已被作者锁定,不允许评论。
-
android BaseActivity与BaseFragment的封装
2016-05-19 15:06 9531 概述 多模块Activity+多Fragment 是开发 ... -
android ScrollView常用属性
2016-05-09 09:17 659android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 28531.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 8551、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 565task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 763上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 564sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6361.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 724andriod提供了Handler和Looper来满足线程间的 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 869在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 667在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1135AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 717概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 744Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1486会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android LruCache内存缓存学习(重写sizeOf方法)
2016-03-09 19:25 1013什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全 ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1660一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 661开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 1003startActivityForResult与startAct ... -
android Toast详解以及自定义Toast例子
2016-01-28 14:15 1527Toast的用法 Toast只是一个View视图,快速的为用 ...
相关推荐
Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 重要函数 •public void recycle() // 回收位图占用的内存空间,把...
图形与图像处理基础 Bitmap与BitmapFactory
Bitmap mp = BitmapFactory.decodeResource(getResources(), R.drawable.number1); mp = mp.copy(Bitmap.Config.ARGB_8888, false); baseApi.setImage(mp); String value = baseApi.getUTF8Text(); 需要,...
一、权限问题 二、调用相机 1、声明provider 首先,我们需要在主配置文件中声明provider,与activity同级别。之所以要用到provider,是...使用BitmapFactory读取imageUri,得到bitmap,然后进行一些压缩,然后显示。
28、Bitmap、BitmapFactory 图形与图像处理 29、Canvas 绘制自定义图形 30、Canvas 采用双缓存实现画图板 31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、...
本文实例讲述了Android图片压缩工具类。...import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImaZipUtil { /** * 压缩图片到指定宽高,并进行质量压缩,最终大小保持在10
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); int imageWidth = options.outWidth; int imageHeight = options.outHeight; System.out.println("imageWidth:"+imageWidth+"=="+...
图片绘制原理: 1. 绘制背景图 绘制图层 被修改的 2. 修改绘制图层 3....1. 案例1: 微信画板 布局: ...import android.content.Intent...import android.graphics.BitmapFactory; import android.graphics.Canvas
28、Bitmap、BitmapFactory 图形与图像处理 29、Canvas 绘制自定义图形 30、Canvas 采用双缓存实现画图板 31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、...
第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 ...
7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...
7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...
第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲图像; 使用Shader填充图形; 7.4...
7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...
第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲图像; 使用Shader填充图形; 7.4...
第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 ...
第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 ...
7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...