Bitmap 详细介绍

 
位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的。 

1. 从资源中获取位图 

可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图。 

当然,首先需要获取资源: 

        Resources res=getResources(); 

使用BitmapDrawable获取位图 

   1. 使用BitmapDrawable (InputStream is)构造一个BitmapDrawable; 

   2. 使用BitmapDrawable类的getBitmap()获取得到位图; 

// 读取InputStream并得到位图 

Java代码 

InputStream is=res.openRawResource(R.drawable.pic180);   

BitmapDrawable bmpDraw=new BitmapDrawable(is);   

Bitmap bmp=bmpDraw.getBitmap();  

InputStream is=res.openRawResource(R.drawable.pic180);

BitmapDrawable bmpDraw=new BitmapDrawable(is);

Bitmap bmp=bmpDraw.getBitmap();

或者采用下面的方式: 

Java代码 

BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180);   

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)解码位图资源,获取位图。 

     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)。 

2. 获取位图的信息 

要获取位图信息,比如位图大小、像素、density、透明度、颜色格式等,获取得到Bitmap就迎刃而解了,这些信息在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 {   

    /** Called when the activity is first created. */  

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

        }     

    }    

}  

public class MainActivity extends Activity {

    /** Called when the activity is first created. */

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

            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来实现。 

Java代码 

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);     

Matrix matrix=new Matrix();   

matrix.postScale(0.8f, 0.8f);   

matrix.postRotate(45);   

Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(),   

bmp.getHeight(),matrix,true);   

canvas.drawColor(Color.BLACK);    

canvas.drawBitmap(dstbmp, 10, 10, null);  

时间: 2024-10-14 01:09:08

Bitmap 详细介绍的相关文章

Android Bitmap详细介绍_Android

复制代码 代码如下: package com.testbitmapscale; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import com.testbitmapscale.R.drawable; im

Android 中的注解详细介绍_Android

注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies

SQL Server 数据库的备份详细介绍及注意事项_Mysql

SQL Server 备份 前言 为什么要备份?理由很简单--为了还原/恢复.当然,如果不备份,还可以通过磁盘恢复来找回丢失的文件,不过SQL Server很生气,后果很严重.到时候你就知道为什么先叫你备份一次再开始看文章了.∩__∩.本系列将介绍SQL Server所有可用的备份还原功能,并尽可能用实例说话. 什么是备份?SQL Server基于Windows,以文件形式存放资料,所以备份就是Windows上SQL Server相关文件的一个某个时间点的副本.根据备份类型的不同,副本的种类和内

ISO7 二维码详细介绍及使用方法_IOS

使用系统自带生成/扫描二维码 iOS7开始苹果集成了二维码的生成的扫描 ### 生成二维码的步骤 导入CoreImage框架 #import <CoreImage/CoreImage.h> 通过滤镜CIFilte生成二维码 ### 二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL 生成二维码 // 1.创建过滤器 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2.恢复默

small标签详细介绍

html教程,small标签详细介绍. 类似于<em></em>之类的短语元素,既可以改进文档结构,同时也保留了预期的视觉样式.但<small></small>在平时应用中不是很常见,第一眼的影响是淘宝UED是不是在这个小问题上疏忽了? 关于<small></small>,网上搜索下来的结果也很零碎,有的说不建议使用,也有的在废弃标签里没有提到它的名字.好在<精通HTML 语义.标准和样式>一书中对此作了详细的解释. &l

微博1分钱变5000元活动网址内容规则详细介绍

  新浪微博开启了"1分钱变5000元现金"活动,用于推广微博支付.在活动期间内(4月25日-5月5日),只要用户通过微博支付成功支付1分钱,变会100%获得现金礼包,金额从1元到5000元不等.下面小编为大家详细介绍微博1分钱变5000元活动详细内容. 活动时间:2014年4月25日-5月5日 参与方式:使用微博支付成功支付一分钱,即可100%获得微博支付的现金奖励,金额最低1元,最高5000元 无论是否绑定过支付宝都可以参与该活动,未绑定的需要绑定.获得的奖金将在7个工作日内打到对

PHP Streams(流)详细介绍及使用

  这篇文章主要介绍了PHP Streams(流)详细介绍及使用,PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件.网络.数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口,需要的朋友可以参考下 PHP Streams是内置核心操作,可能一般的开发者很少用,它用于统一文件.网络.数据压缩等类文件操作方式,并为这些类文件操作提供一组通用的函数接口. 一个stream就是一个具有流式行为的资源对象,每个stream对象都有一个包装类.Stream 可以通过

详细介绍ASP.NETWeb相关服务

经过长时间学习ASP.NETWeb,于是和大家分享一下,看完本文你肯定有不少收获,希望本文能教会你更多东西.学习ASP.NETWeb时,你可能会遇到相关问题,这里将介绍ASP.NETWeb问题的解决方法. 该结构分三个层次:表示层.业务层.数据层.数据层:代表物理数据库.业务层:负责数据层与表示层之间的数据传输.表示层:应用程序的客户端,它通过业务层来访问数据库. 表示层所操作的是驻留在内存中的本地数据,当需要更新数据库数据时,要通过业务层提供的更新方法实现.这样可以大大提高应用程序的性能,而且

十款最出色的PHP安全开发库中文详细介绍(1)

1. PHP入侵检测系统 开发库中文详细介绍(1)-webapp详细开发介绍"> PHP IDS(即PHP-入侵检测系统)是一套易于使用.结构良好.速度出色且专门面向PHP类Web应用程序的先进安全层.这套入侵检测系统既不提供任何缓和及杀毒机制,也不会对恶意输入内容进行过滤,其作用单纯为识别出攻击者们针对站点进行的恶意活动.并以大家需要的方式作出及时提醒.凭借着一整套经过实践检验及相当严格的过滤规则,该检测系统会针对任何攻击活动给出一个影响评级数值,从而帮助用户更轻松地了解应如何应对当前出