`

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切割图片

    在Android中,我们可以使用BitmapFactory类来解析图片资源,将其转化为Bitmap对象。例如: ```java Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image); ``` 接下来,我们讨论...

    android Bitmap特效处理

    在Android开发中,Bitmap是用于表示图像数据的基本类,它在UI设计和图像处理中扮演着重要角色。本文将深入探讨如何使用Bitmap实现各种特效处理,包括黑白特效、底片特效、浮雕特效、模糊特效、锐化特效以及怀旧特效...

    android Bitmap相关知识介绍~~~

    Android 中的 Bitmap 是一种特殊的类,它不能被直接创建,而只能通过 BitmapFactory 来获取。BitmapFactory 提供了多种方法来从不同的图像来源中获取 Bitmap,下面是其中的一些: 1. 从资源文件中获取 Bitmap 可以...

    Android bitmap图片压缩工具类

    在Android开发中,Bitmap对象是处理图像的主要方式,但它们可能会消耗大量内存,尤其是在处理大图或高分辨率图片时。为了优化性能并防止因内存不足引发的“OutOfMemoryError”,开发者通常需要对Bitmap进行压缩。...

    Android bitmap

    Bitmap类是Android系统提供的用于处理图像的主要类,但需要注意的是,Bitmap对象本身并不直接创建,而是通过BitmapFactory类来解析并创建。BitmapFactory提供了多种从不同来源解码图像的方法,如从资源、文件路径或...

    Android图片Bitmap和字符串String之间的相互转换

    总之,Android开发中Bitmap与String之间的转换是图像处理的关键步骤,涉及图像的保存、传输和加载等多个环节。理解并熟练运用这些转换技巧,能够帮助开发者解决各种与图像相关的挑战,提高应用的用户体验。在具体...

    处理bitmap内存溢出问题

    `inSampleSize`是`BitmapFactory.Options`类中的一个重要属性,它允许开发者指定在解码`Bitmap`时应使用的下采样率。通过增加`inSampleSize`的值,可以减少最终`Bitmap`的尺寸和内存占用。例如: ```java ...

    Android上解析24位深度Bitmap文件示例

    在Android平台上,Bitmap是用于表示图像数据的基本类,它提供了对像素颜色的直接访问。24位深度的Bitmap文件,通常指的是每个像素包含红、绿、蓝三个通道,每个通道用8位表示,总共24位。这种格式的Bitmap色彩丰富,...

    android Bitmap用法总结

    Bitmap是Android平台中用于处理图像的核心类,它用于表示位图图像数据。下面是对Bitmap用法的详细总结: 1. **Drawable转换为Bitmap**: 当我们需要将一个Drawable对象(如从XML布局文件中加载的图像)转换为...

    android bitmap outOfMemory解决方法

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不正确管理,它可能导致应用程序运行时出现`OutOfMemoryError`。这是因为Bitmap占用大量的内存,尤其是当加载大尺寸或高分辨率图片时。这个问题在低内存...

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

    Bitmap是Android平台中用于处理图像的核心类,它包含了对图像数据的存储和操作。Bitmap对象存储实际的像素数据,可以通过Bitmap对象进行图像的显示、裁剪、旋转、缩放等操作。以下是一些关于Bitmap的重要知识点: 1...

    Android图形与图像处理

    在Android平台上,图形与图像处理是一项关键技能,它涉及到用户界面设计、游戏开发、相机应用以及其他涉及视觉元素的移动应用程序。本主题主要涵盖Android系统如何处理图形和图像,包括基本概念、API使用以及实例...

    Android图形图像处理技术研究.pdf

    Android图形图像处理技术在Android应用开发中扮演着非常重要的角色,特别是在开发益智类游戏或者2D游戏时,都离不开图形图像处理技术的支持。Android提供了强大的二维图形库,用于绘制2D图像。 2. 绘制图像技术 在...

    android bitmap通过byte数组以流的形式创建

    在Android开发中,Bitmap是用于显示图像的基本类,它是一个位图对象,通常用来加载、显示和处理图片。然而,由于Bitmap对象占用大量的内存,直接加载大图片可能会导致内存溢出(Out Of Memory,OOM)问题。因此,...

    处理android bitmap oom 2.0版本关闭了硬件加速

    在Android开发中,Bitmap对象是用于处理图像的主要工具,但如果不妥善管理,它可能会引发一个常见的问题:Out of Memory(OOM)错误。特别是在处理大尺寸图片时,由于内存限制,系统可能无法分配足够的内存,从而...

    处理android bitmap oom

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是对于大型图像,加载到内存中会消耗大量资源。当应用无法...

    Android图像处理技术

    - BitmapFactory是Android提供的用于解码图片到Bitmap对象的工具类。 2. **Bitmap操作** - 图像缩放:Bitmap.createScaledBitmap()方法用于按比例缩放图像。 - 图像旋转:Bitmap.createBitmap()结合Matrix的...

    bitmap上传图片demo

    总结,"bitmap上传图片demo"是一个综合性的实例,涵盖了Bitmap的加载、显示、裁剪和上传等多个环节,对于学习Android图像处理和优化具有很高的参考价值。在实际开发中,我们需要根据项目的具体需求,灵活运用这些...

    Android图像处理技术(实现Android中的PS)(五)

    在Android平台上,图像处理技术是移动应用开发中的一个重要领域,特别是在创建类似Photoshop(PS)功能的应用时。本文将深入探讨如何在Android中实现图像处理技术,为用户提供类似专业图像编辑软件的功能。以下是对...

    ANDROIDBITMAP内存限制OOM,OUTOFMEMORY.pdf

    文档标题和描述中提到的“ANDROIDBITMAP内存限制OOM,OUTOFMEMORY”指的就是在处理位图(BITMAP)时超出了虚拟机(VM)的内存预算,导致系统抛出OutOfMemoryError异常。 根据给出的内容部分,我们可以推断出以下知识...

Global site tag (gtag.js) - Google Analytics