zoukankan      html  css  js  c++  java
  • android图像与图像处理系列(一、Bitmap和BitmapFactory)

    1、Drawable对象

      Android应用添加了Drawabe资源之后,Android SDK会为这份资源文件在R清单文件中创建一个索引项:R.drawable.file_name,接着我们可以在xml资源文件中通过@drawable/file_name来访问该drawable对象,也可以在java代码中通过R.drawable.file_name来访问该drawable对象,在java代码中R.drawable.file_name只是一个int类型的常量,它只代表了drawable对象的一个id,如果要获取实际的drawable对象,则需要调用Resources的getDrawable(int id)方法来获取。

    2、Bitmap与BitmapFactory

        (1)Bitmap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象,开发者为了把一个Bitmap对象封装成BitmapDrawable对象,可以调用BitmapDrawable的构造器:
          把一个Bitmap对象包装成BitmapDrawable对象
          BitmapDrawable drawable = new BitmapDrawable(bitmap);
        (2)如果需要获取BitmapDrawable所包装的Bitmap对象,可以调用BitmapDrawable的getBitmap()方法:
            获取BitmapDrawable对象所包装的Bitmap对象
            Bitmap bitmap = drawable.getBitmap();
       (3)Bitmap提供了一些静态方法来创建新的Bitmap对象: 
            Bitmap.createBitmap(source, x, y, width,height):从源位图source的指定坐标点x,y开始,从中挖取宽width、高height的一块区域,创建新的Bitmap
          Bitmap.createScaledBitmap(src, dstWidth, dstHeight,filter):对源位图src进行缩放,缩成宽dstWidth、高DSTHeight的新位图 
            Bitmap.createBitmap(width,height, config):创建一个宽width、高height的新位图 
            Bitmap.createBitmap(source, x, y,width, height, m,filter):从源位图source的指定坐标点x,y开始,从中挖取宽width、高height的一块区域,创建新的Bitmap
              ,并按照Matrix指定的规则进行变换
      (4)BitmapFactory是一个工具类,他提供了一些方法用于从不同的数据源来解析、创建Bitmap对象:
           BitmapFactory.decodeByteArray(byte[] data, int offset, int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象
          BitmapFactory.decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象
          BitmapFactory.decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象
          BitmapFactory.decodeResource(Resources res, int id):用于根据给定的资源ID从指定资源文件中解析、创建Bitmap对象 
            BitmapFactory.decodeStream(InputStream is):用于从指定输入流中解析、创建Bitmap对象
      (5)Android为Bitmap提供了两个方法来判断它是否已经回收,以及强制Bitmap回收自己
          isRecycled():判断Bitmap对象是否已经回收
           recycle():强制一个Bitmap对象立即回收自己

    3、实例:图片查看器,查询assets目录下的图片

    布局文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center" >
    
        <ImageView
            android:id="@+id/imageview"
            android:layout_width="300dp"
            android:layout_height="300dp" />
    
        <Button
            android:id="@+id/btn"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="搜索下一个" />
    
    </LinearLayout>

    activity文件:

    package com.example.image;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import android.app.Activity;
    import android.content.res.AssetManager;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.BitmapDrawable;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    /**
     * Bitmap和BitmapFactory
     * @author yinbenyang
     */
    public class MainActivity extends Activity {
    
        private ImageView imageview;
        String[] images = null;
        private Button btn;
        // 用于管理assets文件夹下的资源
        AssetManager assets = null;
        // 当前图片
        int currentImg = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageview = (ImageView) findViewById(R.id.imageview);
            btn = (Button) findViewById(R.id.btn);
            assets = getAssets();
            try {
                // 获取/assets目录下的所有文件
                images = assets.list("");
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 点击按钮查看下一张图片
            btn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //如果图片是最后一个了,就置为第一个
                    if (currentImg >= images.length) {
                        currentImg = 0;
                    }
                    //找到下一个图片文件
                    while (!images[currentImg].endsWith(".png")
                            && !images[currentImg].endsWith(".jpg")
                            && !images[currentImg].endsWith(".gif")) {
                        currentImg++;
                        if (currentImg >= images.length) {
                            currentImg = 0;
                        }
                    }
                    InputStream assetFile = null;
                    try {
                        //打开指定资源对应的输入流
                        assetFile = assets.open(images[currentImg++]);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    BitmapDrawable bitDrawable = (BitmapDrawable)imageview.getDrawable();
                    //如果图片没有回收,先强制回收该图片
                    if(bitDrawable != null && !bitDrawable.getBitmap().isRecycled()){
                        bitDrawable.getBitmap().recycle();
                    }
                    //改变ImageView显示的图片
                    imageview.setImageBitmap(BitmapFactory.decodeStream(assetFile));
                }
            });
        }
    }

    实例效果如下:点击搜索下一个,轮换显示图片

  • 相关阅读:
    结对开发:电梯调度(2)
    小组站立会议
    小组站立会议
    小组站立会议
    小组站立会议4月15日
    小组站立会议
    小组站立会议
    团队个人每天详细计划汇总
    Spring冲刺计划会议
    团队项目开发
  • 原文地址:https://www.cnblogs.com/yby-blogs/p/4556607.html
Copyright © 2011-2022 走看看