`
burnquist
  • 浏览: 69264 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类

android Bitmap学习总结

阅读更多
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等无损格式的图片,会忽略此项设置。

常用的静态方法:
public static Bitmap createBitmap(Bitmap src) ——以src为原图生成不可变得新图像
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
            int dstHeight, boolean filter)——以src为原图,创建新的图像,指定新图像的高宽以及是否可变。
public static Bitmap createBitmap(int width, int height, Config config)——创建指定格式、大小的位图
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,
            Matrix m, boolean filter)


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)

BitmapDrawable类:继承于Drawable,你可以从文件路径、输入流、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.



转:http://blog.csdn.net/xxxx1243/article/details/5834187
首先介绍我们最常用的Bitmap(位图)。位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。按照对位图的操作,分为以下几个功能分别介绍:
从资源中获取位图
获取位图的信息
显示位图
位图缩放
位图旋转
1. 从资源中获取位图
可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。
当然,首先需要获取资源: Resources res=getResources();
使用BitmapDrawable获取位图
   1. 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable;
   2. 使用BitmapDrawable类的getBitmap()获取得到位图;
通过Resource的函数:InputStream  openRawResource(int id)获取得到资源文件的数据流后,也可以通过2种方法来获取Bitmap,如下:
使用BitmapDrawable
(A Drawable that wraps a bitmap and can be tiled, stretched, or aligned.)
使用BitmapDrawable (InputStream is)构造一个BitmapDrawable;
使用BitmapDrawable类的getBitmap()获取得到位图;
BitmapDrawable也提供了显示位图等操作。
Java代码:
InputStream is=res.openRawResource(R.drawable.pic180);  // 读取资源文件获取输入流
BitmapDrawable bmpDraw=new BitmapDrawable(is);  
Bitmap bmp=bmpDraw.getBitmap();
或者:
BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);  
Bitmap bmp=bmpDraw.getBitmap();

使用BitmapFactory
(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.)
使用BitmapFactory类decodeStream(InputStream is)解码位图资源,获取位图。
使用BitmapFactory类Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180); 方法解码位图资源。
BitmapFactory的所有函数都是static,这个辅助类可以通过资源ID、路径、文件、数据流等方式来获取位图。
以上方法在编程的时候可以自由选择,在Android SDK中说明可以支持的图片格式如下:png (preferred), jpg (acceptable), gif (discouraged),虽然bmp格式没有明确说明,但是在Android SDK Support Media Format中是明确说明了。
代码:
方法1:

2. 获取位图的信息
要获取位图信息,比如位图大小、是否包含透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在Bitmap的函数中可以轻松获取到。Android SDK中对Bitmap有详细说明,阅读起来也比较容易,不在此详细说明,这里只是辅助说明以下2点:
在Bitmap中对RGB颜色格式使用Bitmap.Config定义,仅包括ALPHA_8、ARGB_4444、ARGB_8888、RGB_565,缺少了一些其他的,比如说RGB_555,在开发中可能需要注意这个小问题;
Bitmap还提供了compress()接口来压缩图片,不过AndroidSAK只支持PNG、JPG格式的压缩;其他格式的需要Android开发人员自己补充了。
3. 显示位图
显示位图可以使用核心类Canvas,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。
转换为BitmapDrawable对象显示位图
        // 获取位图
        Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
        // 转换为BitmapDrawable对象
        BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
        // 显示位图
        ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
       iv2.setImageDrawable(bmpDraw);
使用Canvas类显示位图
这儿采用一个继承自View的子类Panel,在子类的OnDraw中显示
Java代码
public class MainActivity extends Activity {  
    
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(new Panel(this));  
    }  
      
    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:
Java代码
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);   
    

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);
旋转后的位图显示如下:

除了这种方法之外,我们也可以在使用Bitmap提供的函数如下:
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter),在原有位图旋转的基础上,创建新位图。
总结说明
对位图的操作,结合Android SDK中的类,详细的介绍完了。最后还需要强调的是:这篇文章只是对Android SDK中代码阅读分析,它代替不了你阅读Android SDK,深入的学习还是要仔细的阅读Android SDK。

转载自:http://blog.sina.com.cn/s/blog_5da93c8f0100w3xz.html
分享到:
评论

相关推荐

    bitmap上传图片demo

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

    【Android】使用GLSurfaceView+Canera预览+保存帧Bitmap

    总结起来,这个项目展示了如何利用Android的`GLSurfaceView`和`Camera`组件来实现实时的摄像头预览,并将预览帧保存为Bitmap。这对于开发涉及图像处理、增强现实或视频特效的应用非常有用。通过学习这个案例,开发者...

    android bitmap layout

    总结,"android bitmap layout"涉及了Android应用中Bitmap图像的加载、显示、内存管理和优化等多个方面。开发者需要根据实际需求,合理使用Bitmap,以提供流畅、高效的用户体验。通过学习这些知识点,可以更好地处理...

    android画图总结

    接下来,深入到【Android画图学习总结(二)——Bitmap.doc】,Bitmap是Android中处理图像的基本类。你可以加载本地图片文件,或者通过BitmapFactory解析资源文件得到Bitmap对象。在内存管理中,需要关注Bitmap的...

    采用Bitmap的extractAlpha产生图片边缘光晕效果

    总结来说,Bitmap的extractAlpha方法为我们提供了一种途径,通过处理Alpha通道实现图片的边缘光晕效果。在实际项目中,结合其他图像处理技术,可以创造出各种视觉效果,提升用户体验。同时,理解和掌握源码可以帮助...

    android图片处理总结

    ### Android 图片处理知识点总结 #### 一、Bitmap、Drawable 和 byte[] 之间的相互转换 在 Android 开发中,图片的加载与显示是常见的需求之一。对于开发者来说,掌握 Bitmap、Drawable 以及 byte[] 之间的转换是...

    android画图总结.pdf

    ### Android画图技术详解 #### 一、概述 在Android应用开发中,图像处理是非常重要的一个环节。无论是简单的UI设计还是复杂的游戏开发,都需要用到...希望本文能为正在学习或从事Android开发的朋友们提供一定的帮助。

    android中将图片转化成黑白

    总结来说,将Android中的图片转化为黑白,主要包括以下步骤: 1. 获取Bitmap对象。 2. 二值化处理:遍历每个像素,根据阈值决定其为黑或白。 3. 将处理后的Bitmap显示到UI上。 这个过程可以自定义实现,也可以借助...

    Android画图学习总结(二)-转_玉树临疯

    根据提供的文件信息,本文将对Android绘画技术进行深入解析,主要围绕如何获取位图、提取位图信息、显示位图以及位图的操作等几个方面展开。 ### 一、获取位图资源 在Android开发中,获取位图资源是绘制图像的基础...

    Android性能优化(七)Bitmap内存压缩示例源码BitMapCache.zip

    总结起来,Bitmap内存压缩和优化是Android开发中的关键技巧,通过合理选择解码格式、使用缩放策略、缓存管理和内存池,以及避免主线程操作,可以显著提高应用性能并减少内存问题。"BitMapCache"源码提供了实际操作的...

    Android音视频开发学习思路.pdf

    ### Android音视频开发学习思路详解 #### 一、引言 随着移动互联网的发展,音视频技术在Android平台上的应用越来越广泛。无论是视频通话、在线教育还是直播应用,音视频技术都是核心之一。对于想要深入研究Android...

    android studio 调用相机拍照,选择相册照片

    在Android开发中,调用相机拍照和选择相册...总结,Android Studio调用相机拍照和选择相册照片,主要涉及权限管理、启动相机Intent、处理返回结果以及图片的存储操作。对于更复杂的相机功能,可以深入研究Camera2 API。

    Android画图学习.pdf

    ### Android画图学习知识点 #### 一、概览与背景 在进行Android开发的过程中,开发者可能会遇到关于如何处理图形和图像的问题。这部分内容虽然不是Android SDK文档的重点,但对于希望深入理解Android图形绘制机制...

    Android中使用自定义ImageView实现图片圆形遮罩效果

    在Android开发中,为了实现独特的视觉效果,我们经常需要对...以上内容涵盖了自定义ImageView实现图片圆形遮罩效果的关键技术点,通过学习这些知识,开发者可以更好地掌握Android UI自定义的技巧,提升应用的用户体验。

    android圆形图片实现Demo

    在Android开发中,有时我们需要将普通的矩形图片转换为圆形以适应特定的设计需求,比如用户头像、社交应用中的照片等。...通过学习和理解这个Demo,开发者能够更好地掌握Android图像处理以及自定义视图的相关技能。

    Android-AndroidCamera内置人脸识别的Demo

    总结一下,这个“Android-AndroidCamera内置人脸识别的Demo”涵盖了以下关键知识点: 1. Android Camera API:如何开启和控制摄像头,以及获取图像数据。 2. FaceDetector类:使用此类在图像中检测人脸,获取位置和...

    android重要知识点总结

    Android开发中的重要知识点涵盖了许多方面,对于面试和...以上只是Android开发中的一部分关键知识点,全面掌握还需要不断实践和深入学习。在面试或日常开发中,对这些知识点的熟练运用是衡量开发者专业水平的重要标准。

    Android裁剪图片为圆形图片Demo

    在Android开发中,有时我们需要将普通的矩形图片裁剪成圆形,以适应各种设计需求,例如用户头像、...通过学习和实践这个Demo,开发者能够掌握Android中图片裁剪和形状变换的技巧,提升应用程序的视觉效果和用户体验。

    android-image-filter-ndk,使用android ndk在c中处理位图的android示例项目.zip

    总结,"android-image-filter-ndk"项目为我们提供了一个实战范例,展示了如何结合Android NDK和C语言实现高效的图像处理。通过学习该项目,开发者不仅可以掌握Android NDK的使用,还能深入理解图像处理的原理和技巧...

Global site tag (gtag.js) - Google Analytics