文档章节

Android图像处理之Bitmap类

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:38
字数 874
阅读 35
收藏 2

Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。本文从应用的角度,着重介绍怎么用Bitmap来实现这些功能。

 

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

    Bitmap实现在android.graphics包中。但是Bitmap类的构造函数是私有的,外面并不能实例化,只能是通过JNI实例化。这必然是 某个辅助类提供了创建Bitmap的接口,而这个类的实现通过JNI接口来实例化Bitmap的,这个类就是BitmapFactory。

Android图像处理之Bitmap类

图一、BitmapFactory主要方法及Options选项

 

利用BitmapFactory可以从一个指定文件中,利用decodeFile()解出Bitmap;也可以定义的图片资源中,利用decodeResource()解出Bitmap。

 

1.2 decode时的选项

在使用方法decodeFile()/decodeResource()时,都可以指定一个BitmapFacotry.Options

利用Options的下列属性,可以指定decode的选项:

  • inPreferredConfig 指定decode到内存中,手机中所采用的编码,可选值定义在Bitmap.Config中。缺省值是ARGB_8888。
  • inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
  • inSampleSize 设置decode时的缩放比例。

 

利用Options的这些值就可以高效的得到一幅缩略图。

Android图像处理之Bitmap类

图二、BitmapFactory.decodeFile()

 

先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息[Step#2~4];

利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据[Step#5~8]。

先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。

 

二、利用Bitmap和Matrix实现图像变换

    Bitmap可以和Matrix结合实现图像的剪切、旋转、缩放等操作。

Android图像处理之Bitmap类

图三、Bitmap方法

 

用源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)
1 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,  
2             Matrix m, boolean filter)  
3 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height)  
4 public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,  
5             int dstHeight,boolean filter)

第一个方法是最终的实现,后两种只是对第一种方法的封装。

第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切;第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。

 

设置Matrix的Rotate(通过setRotate())或者Scale(通过setScale()),传入第一个方法,可实现旋转或缩放。

Android图像处理之Bitmap类

图四、Bitmap实现旋转

 

三、保存图像文件

    经过图像变换之后的Bitmap里的数据可以保存到图像压缩文件里(JPG/PNG)。

Android图像处理之Bitmap类

图五、保存Bitmap数据到文件

 

这个操作过程中,Bitmap.compress()方法的参数format可设置JPEG或PNG格式;quality可选择压缩质量;fOut是输出流(OutputStream),这里的FileOutputStream是OutputStream的一个子类。

 

总结一下,本文介绍Bitmap的使用方法——用Bitmap实现图像文件的读取和写入,并用Bitmap实现图像的剪切、旋转和缩放变换。

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/17096901

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Android实战经验之图像处理及特效处理的集锦(总结版)

1 Android学习笔记进阶之在图片上涂鸦(能清屏) 2 Android学习笔记之详细讲解画圆角图片 3 Android学习笔记进阶20之得到图片的缩略图 4 Android学习笔记进阶19之给图片加边框 5 Android学习笔...

xiaosi
2012/03/12
4W
25
Canvas/Shader- Android

Shader的五个子类:BitmapShader、LinearGradient、RadialGradient、SweepGradient和ComposeShader。 Android中Canvas绘图之Shader使用图文详解- https://blog.csdn.net/iispring/article/de......

shareus
2018/05/15
0
0
数字图像处理、拼接,图像静态滤镜(GPUImage/GPU加速) - Android

图像滤镜处理的两种方式:RGB点乘运算;GPU的矩阵运算(效率更高)。图片处理中的计算:RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片;矩阵~利用矩阵计算得到新的矩阵修改图片。 几个...

元谷
2019/03/12
201
0
RenderScript高斯模糊等与图片处理/计算机视觉-Android

> RenderScript Google 官方RenderScript- https://developer.android.com/guide/topics/renderscript/compute RenderScript在3.0引入,而一些内置的compute kernel在JELLYBEANMR1中引入,为......

shareus
2018/05/03
0
0
Android学习笔记09:Paint及Canvas的简单应用

Android学习笔记09:Paint及Canvas的简单应用   在Android中需要通过graphics类来显示2D图形。   graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等常用...

Carl_
2015/01/07
88
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在PHP中获取字符串的最后一个字符?

我需要获取字符串的最后一个字符。 假设我有“测试人员”作为输入字符串,并且我希望结果为“ s”。 如何在PHP中做到这一点? #1楼 请记住,如果有一个字符串使用fgets()函数从文本文件中读取...

javail
20分钟前
23
0
DaY07方法重写的面试题

方法重写的面试题 * Override和Overload的区别?Overload能改变返回值类型吗? * overload可以改变返回值类型,只看参数列表 * 方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值...

Lao鹰
23分钟前
23
0
用Markdown编程之类型

类型就是约定。而现有的类型是单纬度的。用标注法编程好处就是可以多维度。 类型基础分为: 虚 实 在此之上分为: 根 寄存器级 联 内存级 外 网络级 虚:说白了就是指针或索引之类的概念。之...

dwcz
41分钟前
66
0
每天AC系列(四):四数之和

1 题目 Leetcode第18题,给定一个数组与一个target,找出数组中的四个数之和为target的不重复的所有四个数. 2 暴力 List<List<Integer>> result = new ArrayList<>();if (nums.length == 4 &......

Blueeeeeee
今天
70
0
git clone --mirror和git clone --bare有什么区别

git clone帮助页面上有关于--mirror : 设置远程存储库的镜像。 这意味着--bare 。 但没有详细介绍--mirror克隆与--bare克隆--mirror不同。 #1楼 克隆将从远程服务器复制参考,并将其填充到名...

技术盛宴
今天
86
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部