Android突破一之Bitmap、BitmapFactory、BitmapDrawable类


Bitmap、BitmapFactory、BitmapDrawable
Jiangdg_VIP
http://blog.csdn.net/u012637501

一、概要:
    位图由图形图像及其属性的像素数据组成。Bitmap 是 Bitmap是Android系统中的图像处理的最重要类一,用于处理由像素数据定义的图像的对象。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。
二、特点 :public  final  class即不能被继承;
ava.lang.Object
   ↳ android.graphics.Bitmap
三、类方法
1.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, OutputStream stream)——按指定的图片格式以及画质,将图片转换为输出流。
format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:画质,0-100.0表示最低画质压缩,100以最高画质压缩。对于PNG等无损格式的图片,会忽略此项设置。 
2.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 static Bitmap decodeFile(String pathName, Options opts)
public static Bitmap decodeFile(String pathName)
读取一个资源文件得到一个位图。如果位图数据不能被解码,或者opts参数只请求大小信息时,则返回NuLL。 
(即当Options.inJustDecodeBounds=true,只请求图片的大小信息。)
public static Bitmap decodeResource(Resources res, int id)
public static Bitmap decodeResource(Resources res, int id, Options opts)
从输入流中解码位图  
public static Bitmap decodeStream(InputStream is)
从字节数组中解码生成不可变的位图
public static Bitmap decodeByteArray(byte[] data, int offset, int length)
3.BitmapDrawable类:继承于Drawable,包装了一个位图,这个位图可以被平铺、拉伸、对齐。你可以从文件路径、输入流、XML文件以及Bitmap中创建。 如果是在XML资源中创建,则需要<bitmap>元素。
常用的构造函数:
Resources res=getResources();//获取资源
public BitmapDrawable(Resources res)——创建一个空的drawable。(Response用来指定初始时所用的像素密度)替代public BitmapDrawable()方法(此方法不处理像素密度)
public BitmapDrawable(Resources res, Bitmap bitmap)——Create drawable from a bitmap
public BitmapDrawable(Resources res, String filepath)——Create a drawable by opening a given file path and decoding the bitmap.
public BitmapDrawable(Resources res, java.io.InputStream is)——Create a drawable by decoding a bitmap from the given input stream.
final Bitmap getBitmap():返回被这个drawable渲染的位图
四、使用详解:
    按照对位图的操作,分为以下几个功能分别介绍: 从资源中获取位图、获取位图的信息、显示位图、位图缩放、位图旋转。 
1.从资源中获取位图:可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。
a.使用BitmapDrawable获取位图 
步骤:首先 获取资源文件,然后 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable;再 使用BitmapDrawable类的getBitmap()获取得到位图。另外, BitmapDrawable提供了显示位图等操作。 
   Resources res=getResources();                                         //获取资源文件
     InputStream is=res.openRawResource(R.drawable.plane); // 读取资源文件获取输入流
     BitmapDrawable bmpDraw=new BitmapDrawable(is);       //实例化一个BitmapDrawable对象
     Bitmap bmp=bmpDraw.getBitmap();                                //使用BitmapDrawable类的getBitmap()获取得到位图
或者:
      BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.plane); //获取并读取资源文件
      Bitmap bmp=bmpDraw.getBitmap();                                //使用getBitmap()方法获取得到位图,返回值为Bitmap对象
b.使用BitmapFactory 获取位图
步骤:两种方式,一是使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。二是使用BitmapFactory类Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.plane); 方法解码位图资源。由于BitmapFactory的所有函数都是static,所有的函数直接由类调用,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。
    Resources res=getResources();                                                             //获取资源文件
    Bitmap plane=BitmapFactory.decodeResource(res, R.drawable.plane); //获取图片
注意,res也可以使用context. getResources()替代。在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),虽然bmp格式没有明确说明,但是在Android SDK Support Media Format中是明确说明了。
2. 获取位图的信息
    要获取位图信息,比如位图大小是否包含透明度颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的函数中可以轻松获取到。需要注意的是 在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要。
3. 显示位图
    显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。也可以通过BitmapDrawable将位图显示到View中,  转换为BitmapDrawable对象显示位图。
方法一: 通过BitmapDrawable将位图显示到View中, 转换为BitmapDrawable对象显示位图
        Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);  // 获取位图 
        BitmapDrawable bmpDraw=new BitmapDrawable(bmp);    // 转换为BitmapDrawable对象 
        ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);  // 显示位图
         iv2.setImageDrawable(bmpDraw); 
方法二:通过Canvas类drawBirmap()显示位图 -采用一个继承自View的子类Panel,在子类的onDraw中显示
    public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Panel(this));        //将位图显示在Activity上
    }   
    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 the specified scale.),不过要注意此时整个画布都缩放了。
(4)借助Matrix: 
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);    //获取位图
Matrix matrix=new Matrix();
matrix.postScale(0.2f, 0.2f);
Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true);    
canvas.drawColor(Color.BLACK);                                                                             //显示位图
canvas.drawBitmap(dstbmp, 10, 10, null);                            <span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">   </span>
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);     
                     
参考资料:
http://developer.android.com/reference/android/graphics/Bitmap.html
http://bbs.chinaunix.net/thread-3682769-1-1.html

你可能感兴趣的:(Android开发)