BitMap
类:
public void recycle()—— 回收位图占用的内存空间,把位图标记为 Dead
public final boolean isRecycled() —— 判断位图内存是否已释放
public final int getWidth()—— 获取位图的宽度
public final int getHeight()—— 获取位图的高度
public final boolean isMutable()—— 图片是否可修改
public int getScaledWidth(Canvas canvas)—— 获取指定密度转换后的图像的宽度
public int getScaledHeight(Canvas canvas)—— 获取指定密度转换后的图像的高度
public boolean compress(CompressFormat format, int quality, OutputStreamstream)—— 按指定的图片格式以及画质,将图片转换为输出流。
format : Bitmap.CompressFormat.PNG 或 Bitmap.CompressFormat.JPEG
quality :画质, 0-100.0 表示最低画质压缩, 100 以最高画质压缩。对于 PNG 等无损格式的图片,会忽略此项设置。
public void recycle()—— 回收位图占用的内存空间,把位图标记为 Dead
public final boolean isRecycled() —— 判断位图内存是否已释放
public final int getWidth()—— 获取位图的宽度
public final int getHeight()—— 获取位图的高度
public final boolean isMutable()—— 图片是否可修改
public int getScaledWidth(Canvas canvas)—— 获取指定密度转换后的图像的宽度
public int getScaledHeight(Canvas canvas)—— 获取指定密度转换后的图像的高度
public boolean compress(CompressFormat format, int quality, OutputStreamstream)—— 按指定的图片格式以及画质,将图片转换为输出流。
format : Bitmap.CompressFormat.PNG 或 Bitmap.CompressFormat.JPEG
quality :画质, 0-100.0 表示最低画质压缩, 100 以最高画质压缩。对于 PNG 等无损格式的图片,会忽略此项设置。
常用的静态方法:
public staticBitmap createBitmap(Bitmap src)
——以
src
为原图生成不可变得新图像
public staticBitmap createScaledBitmap(Bitmap src, int dstWidth,
int dstHeight, boolean filter)
——以
src
为原图,创建新的图像,指定新图像的高宽以及是否变。
public staticBitmap createBitmap(int width, int height, Config config)
——创建指定格式、大小的位图
public staticBitmap createBitmap(Bitmap source, int x, int y, int width, int height)
以
source
为原图,创建新的图片,指定起始坐标以及新图像的高宽。
public staticBitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrixm, boolean filter)
BitmapFactory
工厂类:
Option 参数类:
public boolean inJustDecodeBounds
——如果设置为
true
,不获取图片,不分配内存,但会返回图片的高宽度信息。
public int inSampleSize
——图片缩放的倍数。如果设为
4
,则宽和高都为原来的
1/4
,则图是原来的
1/16
。
public int outWidth
——获取图片的宽度值
public int outHeight
——获取图片的高度值
public int inDensity——用于位图的像素压缩比
public int inTargetDensity
——用于目标位图的像素压缩比(要生成的位图)
public boolean inScaled
——设置为
true
时进行图片压缩,从
inDensity
到
inTargetDensity
。
读取一个文件路径得到一个位图。如果指定文件为空或者不能解码成文件,则返回
NULL
。
public staticBitmap decodeFile(String pathName, Options opts)
public staticBitmap decodeFile(String pathName)
读取一个资源文件得到一个位图。如果位图数据不能被解码,或者
opts
参数只请求大小信息时,则返回
NuLL
。(即当
Options.inJustDecodeBounds=true,
只请求图片的大小信息。)
public staticBitmap decodeResource(Resources res, int id)
public staticBitmap decodeResource(Resources res, int id, Options opts)
从输入流中解码位图
public static Bitmap decodeStream(InputStreamis)
从字节数组中解码生成不可变的位图
public staticBitmap decodeByteArray(byte[] data, int offset, int length)
BitmapDrawable
类:继承于
Drawable
,你可以从文件路径、输入流、
XML
文件以及
Bitmap
中创建。
常用的构造函数:
Resourcesres=getResources();//
获取资源
publicBitmapDrawable(Resources res)
——创建一个空的
drawable
。(
Response
用来指定初始时所用的像素密度)替代
public BitmapDrawable()
方法(此方法不处理像素密度)
publicBitmapDrawable(Resources res, Bitmap bitmap)——Create drawable from a bitmap
publicBitmapDrawable(Resources res, String filepath)——Create a drawable by opening agiven file path and decoding the bitmap.
publicBitmapDrawable(Resources res, java.io.InputStream is)——Create a drawable bydecoding a bitmap from the given input stream.
首先介绍我们最常用的
Bitmap(
位图
)
。位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。按照对位图的操作,分为以下几个功能分别介绍:
从资源中获取位图
获取位图的信息
显示位图
位图缩放
位图旋转
1.
从资源中获取位图
可以使用
BitmapDrawable
或者
BitmapFactory
来获取资源中的位图。
当然,首先需要获取资源:
Resources res=getResources();
使用
BitmapDrawable
获取位图
1.
使用
BitmapDrawable (InputStream is)
构造一个
BitmapDrawable
;
2.
使用
BitmapDrawable
类的
getBitmap()
获取得到位图;
通过
Resource
的函数:
InputStream openRawResource(int id)
获取得到资源文件的数据流后,也可以通
2
种方法来获取
Bitmap
,如下:
使用
BitmapDrawable
(
A Drawable that wraps a bitmap and can be tiled,stretched, or aligned.
)
使用
BitmapDrawable (InputStream is)
构造一个
BitmapDrawable
;
使用
BitmapDrawable
类的
getBitmap()
获取得到位图;
BitmapDrawable
也提供了显示位图等操作。
InputStreamis=res.openRawResource(R.drawable.pic180); //
读取资源文件获取输入流
BitmapDrawablebmpDraw=new BitmapDrawable(is);
Bitmapbmp=bmpDraw.getBitmap();
或者:
BitmapDrawablebmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);
Bitmapbmp=bmpDraw.getBitmap();
使用
BitmapFactory
(
Creates Bitmap objects from various sources, includingfiles, streams, and byte-arrays.
)
使用
BitmapFactory
类
decodeStream(InputStream is)
解码位图资源,获取位图。
使用
BitmapFactory
类
Bitmap bmp=BitmapFactory.decodeResource(res,R.drawable.pic180);
方法解码位图资源。
BitmapFactory
的所有函数都是
static
,这个辅助类可以通过资源
ID
、路径、文件、数据流等方式来获取位图。
以上方法在编程的时候可以自由选择,在
Android SDK
中说明可以支持的图片格式如下:
png (preferred), jpg (acceptable), gif(discouraged)
,虽然
bmp
格式没有明确说明,但是在
Android SDK Support Media Format
中是明确说明了。
2.
获取位图的信息
要获取位图信息,比如位图大小、是否包含透明度、颜色格式等,获取得到
Bitmap
就迎刃而解了,这些信息在
Bitmap
的函数中可以轻松获取到。
Android SDK
中对
Bitmap
有详细说明,阅读起来也比较容易,不在此详细说明,这里只是辅助说明以下
2
点:
在
Bitmap
中对
RGB
颜色格式使用
Bitmap.Config
定义,仅包括
ALPHA_8
、
ARGB_4444
、
ARGB_8888
、
RGB_565
,缺少了一些其他的,比如说
RGB_555
,在开发中可能需要注意这个小问题;
Bitmap
还提供了
compress()
接口来压缩图片,不过
AndroidSAK
只支持
PNG
、
JPG
格式的压缩;其他格式的需要
Android
开发人员自己补充了。
3.
显示位图
显示位图可以使用核心类
Canvas
,通过
Canvas
类的
drawBirmap()
显示位图,或者借助于
BitmapDrawable
来将
Bitmap
绘制到
Canvas
。当然,也可以通过
BitmapDrawable
将位图显示到
View
中。
转换为
BitmapDrawable
对象显示位图
//
获取位图
Bitmapbmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
//
转换为
BitmapDrawable
对象
BitmapDrawable bmpDraw=newBitmapDrawable(bmp);
//
显示位图
ImageView iv2 =(ImageView)findViewById(R.id.ImageView02);
iv2.setImageDrawable(bmpDraw);
使用
Canvas
类显示位图
这儿采用一个继承自
View
的子类
Panel
,在子类的
OnDraw
中显示
Java
代码
public classMainActivity extends Activity {
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new Panel(this));
}
class Panel extends View{
public Panel(Context context) {
super(context);
}
public void onDraw(Canvas canvas){
Bitmap bmp =BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(bmp, 10, 10,null);
}
}
}
4.
位图缩放
(
1
)将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样:
drawBitmap(Bitmap bitmap, Rect src, Rect dst,Paint paint)
。
(
2
)在原有位图的基础上,缩放原位图,创建一个新的位图:
CreateBitmap(Bitmap source, int x, int y,int width, int height, Matrix m, boolean filter)
(
3
)借助
Canvas
的
scale(float sx, float sy)
(
Preconcat the current matrix with thespecified scale.
),不过要注意此时整个画布都缩放了。
(
4
)借助
Matrix
:
Bitmap bmp =BitmapFactory.decodeResource(getResources(), R.drawable.pic180);
Matrix matrix=new Matrix();
matrix.postScale(0.2f,0.2f);
Bitmapdstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),
bmp.getHeight(),matrix,true);
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(dstbmp,10, 10, null);
5.
位图旋转
同样,位图的旋转也可以借助
Matrix
或者
Canvas
来实现。
Matrix
在线性代数中都学习过,
Android SDK
提供了
Matrix
类,可以通过各种接口来设置矩阵。结合上面的例子程序,将位图缩放例子程序在显示位图的时候前,增加位图旋转功能,修改代码如下:
Matrix matrix = new Matrix();
//matrix.postScale(0.5f,0.5f);
matrix.setRotate(90,120,130);
canvas.drawBitmap(mbmpTest,matrix, mPaint);
除了这种方法之外,我们也可以在使用
Bitmap
提供的函数如下:
public staticBitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrixm, boolean filter)
,在原有位图旋转的基础上,创建新位图。
总结说明
对位图的操作,结合
Android SDK
中的类,详细的介绍完了。最后还需要强调的是:这篇文章只是对
Android SDK
中代码阅读分析,它代替不了你阅读
Android SDK
,深入的学习还是要仔细的阅读
Android SDK
。