`

android Bitmap,BitmapFactory类图像处理

 
阅读更多
BitMap代表一张位图,扩展名可以是.bmp或者.dib。
位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。
例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/8=3072KB
位图文件图像效果好,但是非压缩格式的,需要占用较大存储空间,不利于在网络上传送。
jpg格式则恰好弥补了位图文件这个缺点。

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

一、Bitmap的生成

1.1 BitmapFactory decode出Bitmap

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



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

1.2 decode时的选项

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

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

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

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



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

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

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

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

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



用源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)


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

第二个方法可以从源Bitmap中指定区域(x,y, width, height)中挖出一块来实现剪切

第三个方法可以把源Bitmap缩放为dstWidth x dstHeight的Bitmap。

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




三、保存图像文件

//30 是压缩率,表示压缩70%; 如果不压缩是100,表示压缩率为0  
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, outputstream);


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



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

从资源文件中获取
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img1); 


从SD卡中得到图片
(方法1) 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+"/"+"haha.jpg"; 
Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); 
(方法2)
InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); 
Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream);


由于前面创建的Bitmap所占用的内存还没有回收,而导致引发OutOfMemory错误,所以用下面方法判断是否回收。
if(!bitmap.isRecycled())
{
   bitmap.recycle()
}      


按新图片高宽进行压缩

//得到图片原始的高宽
        int rawHeight = rawBitmap.getHeight();
        int rawWidth = rawBitmap.getWidth();
        // 设定图片新的高宽
        int newHeight = 500;
        int newWidth = 500;
        // 计算缩放因子
        float heightScale = ((float) newHeight) / rawHeight;
        float widthScale = ((float) newWidth) / rawWidth;
        // 新建立矩阵
        Matrix matrix = new Matrix();
        matrix.postScale(heightScale, widthScale);
        // 设置图片的旋转角度
        // matrix.postRotate(-30);
        // 设置图片的倾斜
        // matrix.postSkew(0.1f, 0.1f);
        // 将图片大小压缩
        // 压缩后图片的宽和高以及kB大小均会变化
        Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,
                rawWidth, matrix, true);


设置图片的圆角,返回设置后的BitMap

public Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
        Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(roundCornerBitmap);
        int color = 0xff424242;// int color = 0xff424242;
        Paint paint = new Paint();
        paint.setColor(color);
        // 防止锯齿
        paint.setAntiAlias(true);
        Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        RectF rectF = new RectF(rect);
        float roundPx = pixels;
        // 相当于清屏
        canvas.drawARGB(0, 0, 0, 0);
        // 先画了一个带圆角的矩形
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        // 再把原来的bitmap画到现在的bitmap!!!注意这个理解
        canvas.drawBitmap(bitmap, rect, rect, paint);
        return roundCornerBitmap;
    }


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


转自:http://www.open-open.com/lib/view/open1333418945202.html
  • 大小: 73.1 KB
  • 大小: 76.4 KB
  • 大小: 50 KB
  • 大小: 37 KB
  • 大小: 45.3 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Android图片缓存之Bitmap详解(一)

    Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。  重要函数  •public void recycle() // 回收位图占用的内存空间,把...

    android图像图形及动画

    图形与图像处理基础 Bitmap与BitmapFactory

    Android图像数字识别

    Bitmap mp = BitmapFactory.decodeResource(getResources(), R.drawable.number1); mp = mp.copy(Bitmap.Config.ARGB_8888, false); baseApi.setImage(mp); String value = baseApi.getUTF8Text(); 需要,...

    Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传

    一、权限问题 二、调用相机 1、声明provider 首先,我们需要在主配置文件中声明provider,与activity同级别。之所以要用到provider,是...使用BitmapFactory读取imageUri,得到bitmap,然后进行一些压缩,然后显示。

    android开发demo集合

    28、Bitmap、BitmapFactory 图形与图像处理 29、Canvas 绘制自定义图形 30、Canvas 采用双缓存实现画图板 31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、...

    Android开发之图片压缩工具类完整实例

    本文实例讲述了Android图片压缩工具类。...import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImaZipUtil { /** * 压缩图片到指定宽高,并进行质量压缩,最终大小保持在10

    图片缓存机制代码

    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); int imageWidth = options.outWidth; int imageHeight = options.outHeight; System.out.println("imageWidth:"+imageWidth+"=="+...

    Android 图像处理2

    图片绘制原理:   1. 绘制背景图 绘制图层 被修改的  2. 修改绘制图层  3....1. 案例1: 微信画板 布局: ...import android.content.Intent...import android.graphics.BitmapFactory; import android.graphics.Canvas

    android初学者入门项目

    28、Bitmap、BitmapFactory 图形与图像处理 29、Canvas 绘制自定义图形 30、Canvas 采用双缓存实现画图板 31、SharedPreference 简单的key-value数据存取 32、SQLiteDatabase 安卓客户端的嵌入式数据库 33、...

    疯狂Android讲义源码

     第7章 图形与图像处理 259  7.1 使用简单图片 260  7.1.1 使用Drawable对象 260  7.1.2 Bitmap和BitmapFactory 260  7.2 绘图 263  7.2.1 Android绘图基础:Canvas、  Paint等 263  7.2.2 Path类 267  ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    疯狂Android讲义(第2版)源代码 第6章~第9章

    第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲图像; 使用Shader填充图形; 7.4...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

    Android实例代码

    第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图:Canvas; Paint; Path; 7.3、图形特效处理:使用Matrix控制变换; 使用drawBitmapMesh扭曲图像; 使用Shader填充图形; 7.4...

    疯狂Android讲义.part2

    第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 ...

    疯狂Android讲义.part1

    第7章 图形与图像处理 259 7.1 使用简单图片 260 7.1.1 使用Drawable对象 260 7.1.2 Bitmap和BitmapFactory 260 7.2 绘图 263 7.2.1 Android绘图基础:Canvas、 Paint等 263 7.2.2 Path类 267 7.2.3 绘制游戏动画 ...

    Google Android SDK开发范例大全的目录

    7.2 绘制几何图形——使用android.graphics类 7.3 手机屏幕保护程序——FadeIn/FadeOut特效与运行线程 7.4 用手指移动画面里的照片——onTouchEvent事件判断 7.5 加载存储卡的Gallery相簿——FileArrayList 7.6 取得...

Global site tag (gtag.js) - Google Analytics