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));
            }
        });
    }
}

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

时间: 2024-10-20 11:09:29

android图像与图像处理系列(一、Bitmap和BitmapFactory)的相关文章

[Android] 图像各种处理系列文章合集

    这是我最近在做Android随手拍一个项目的各种网上关于图片处理的资料,以前学过数字图像处理都是用C++写的,下面的资料个人认为是非常优秀的各种集合,另一方面它是在线笔记,希望对大家有所帮助吧!其中我截图部分都是作者经典的文章显示效果. 1.<android图片处理总结>作者邮箱可能是[email protected],同时sjf0115转载很多文章,非常优秀的一本短书.感谢作者和博主sjf0115(落日小屋). android图像处理系列之三--图片色调饱和度.色相.亮度处理    

[Android] 随时拍图像处理部分总结及源码分享

随着寒假到来,终于有时间总结下Android这个随手拍的课程作业了,同时分享了我完成的这部分对图像处理的心得吧!你可以结合demo来阅读这篇文章,希望对大家有所帮助. 如果你绝对下面文字太过啰嗦,可以直接下载demo.如果你要做android图像处理相关的App,可能对你有些启发.如果文章中有不足之处,请海涵!仅想分享些东西罢了~ demo下载地址:上传ing 一. 项目结构及界面 项目工程结构如下图所示:    个人还是比较欣赏这个布局的,其中MainActivity.java是主界面,Pro

android图像处理系列之七--图片涂鸦,水印-图片叠加

图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操作像素点.下面给出别外一种方式让图片叠加--用Canvas处理图片,canvas已经封装好了,直接调用就行. 下面看效果: += 代码: [java] view plain copy /** * 组合涂鸦图片和源图片 * @param src 源图片 * @param watermark 涂鸦图片

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一.图片处理层: [java] view plaincopy package com.jacp.tone.view; import java.util.ArrayList; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android

android图像处理系列之五--给图片添加边框(中)

前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水平是达不到,不排除牛人,再说了PS那些效果都是程序员做出来,肯定有实现的方法,这可能就要涉及很复杂的图形学.扯远了,接来说怎么用那些精美的花边做为图片的边框.简单的方式是用两张图片叠加.最简单的一种是本文介绍的,用透明的PNG格式图片.因为Android是支持PNG图片处理的,而且PNG图片有透明度

android图像处理系列之四--给图片添加边框(上)

图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路.也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码.下面的代码主要是给出第一种方法,后一种给出代码

android图像处理系列之四-- 给图片添加边框(上)

图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下角,右边,右上角,上边,其中左右上下只需要一个有效长度,就像重写水平进度条一样,只需要一个有效的长度,然后平铺,就达到了最后想要的效果,不错,左右上下边采用的也是这样的思路.也可以将八张图片组合在一起,然后读取整张图片,用代码裁剪,下面会给出相应的代码.下面的代码主要是给出第一种方法,后一种给出代码

Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)

转载自http://blog.csdn.net/csxwc/article/details/10345235 Bitmap是Android系统中的图像处理的最重要的类之一.用它可以获取图像文件信息,对图像进行旋转,剪切,放大,缩小等操作. Bitmap代表一张位图,使我们在开发中常用的资源,下面就对Bitmap进行简单的介绍. Bitmap的获取方法: 1.使用BitmapDrawable BitmapDrawable里封装的图片就是一个Bitmap对象,我们要把Bitmap包装成BitmapD

Android性能优化系列之Bitmap图片优化

在Android开发过程中,Bitmap往往会给开发者带来一些困扰,因为对Bitmap操作不慎,就容易造成OOM(Java.lang.OutofMemoryError - 内存溢出),本篇博客,我们将一起探讨Bitmap的性能优化. 为什么Bitmap会导致OOM? 1.每个机型在编译ROM时都设置了一个应用堆内存VM值上限dalvik.vm.heapgrowthlimit,用来限定每个应用可用的最大内存,超出这个最大值将会报OOM.这个阀值,一般根据手机屏幕dpi大小递增,dpi越小的手机,每