Android Bitmap和Drawable

浏览:1144 ℃
字体:
发布时间:2013-12-11 11:02:58
来源:

 

 

 

一、概念区别

Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB8888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。

Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。

Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。

二、Android读取不同位置(drawable,asset,SDCard)的图片资源

方式一:

已将图片保存到drawable目录下,通过图片id获得Drawable或者Bitmap,此方式最常用。(若只知道图片的名称,还可以通过图片的名称获得图片的id)

(1)通过图片id获得Drawable

Drawable drawable=getResource().getDrawable(R.drawable.xxx);

(2)通过图片id获得Bitmap

Resource res=gerResource();

Bitmap bitmap=BitmapFactory.decodeResource(res, id);

(3)通过图片的名称获得图片的id(两种方法)

int id =res.getIdentifier(name, defType, defPackage); //name:图片的名,defType:资源类型(drawable,string。。。),defPackage:工程的包名

Drawable drawable=getResource().getDrawable(id);

方式二:

已将图片保存到assest目录下,知道图片的名称,通过inputstream获得图片Drawabl

或者 Bitmap

AssetManager asm=getAssetMg();

InputStream is=asm.open(name);//name:图片的名称

(1)获得Drawable

Drawable da = Drawable.createFromStream(is, null);

(2)获得Bitmap

Bitmap bitmap=BitmapFactory.decodeStream(is);

方式三: 图片保存在sdcard,通过图片的路径h

/图片路径

String imgFilePath = Environment.getExternalStorageDirectory().toString()

+ “/DCIM/device.png”;

(1)文件输入流

fis = new FileInputStream(new File(imgFilePath));//文件输入流

Bitmap bmp = BitmapFactory.decodeStream(fis);

(2)

ImageView iv = (ImageView) findViewById(R.id.image);

Bitmap bit = BitmapFactory.decodeFile(/sdcard/android.bmp);

iv.setImageBitmap(bit);

iv.setImageDrawable(Drawable.createFromPath(new File(Environment.getExternalStorageDirectory(), camera.jpg).getAbsolutePath()));


三、Drawable、Bitmap、byte[]之间的转换

1) Drawble转Bitmap

public static Bitmap drawableToBitmap(Drawable drawable) {

Bitmap bitmap = Bitmap

.createBitmap(

drawable.getIntrinsicWidth(),

drawable.getIntrinsicHeight(),

drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888

: Bitmap.Config.RGB_565);

Canvas canvas = new Canvas(bitmap);

//canvas.setBitmap(bitmap);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

drawable.draw(canvas);

return bitmap;

}

2) 从资源中获取Bitmap

Resources res=getResources();

Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

 

3) Bitmap → byte[]

private byte[] Bitmap2Bytes(Bitmap bm){

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.PNG, 100, baos);

return baos.toByteArray();

}

4) byte[] → Bitmap

private Bitmap Bytes2Bimap(byte[] b){

if(b.length!=0){

return BitmapFactory.decodeByteArray(b, 0, b.length);

}

else {

return null;

}

}

//将assets文件中资源取出,并将图片从bitmap转换成drawable格式

public static Drawable getDrawableFromAssetFile(Context context,String fileName){

Bitmap image = null;

BitmapDrawable drawable=null;

try{

AssetManager am = context.getAssets();

InputStream is = am.open(fileName);

image = BitmapFactory.decodeStream(is);

drawable= new BitmapDrawable(context.getResources(), image);

is.close();

}catch(Exception e){

}

return drawable;

}

四、APK程序里的drawable—hdpi、drawable—mdpi、drawable—ldpi详解

自己DIY过APK程序的达人们肯定会对于android中放置图片的地方drawable—hdpi、drawable—mdpi、drawable—ldpi这三个感到好奇。肯定心里会想,放在哪一个都行,只要是在android中的res目录下的drawable中就行,系统会自己找到。有心的朋友肯定会他把弄个究竟。我以前对drawable—hdpi、drawable—mdpi、drawable—ldpi这三个也了解了一下,但是只是字面上的,没有真正理解透彻,到今天我才算有稍深点的理解。drawable—hdpi看他的单词名肯定知道他是放置高分辨率的图片,drawable—mdpi放置中等分辨率的图片,drawable—ldpi放置低分辨率的图片。大部分人都把的图片放在drawable—mdpi中。起初我认为随便将图片放置在三个当中的任意一个都行,但是今天我知道了。在分辨率低于480*800时把图片放在drawable—mdpi中是不会有什么影响,但是当分辨率为420*800或高于它时就会出问题了。你的手机屏幕有那么大但是他会将图片拉伸,当加载图片后让你感觉该屏幕没有实际的大小,而如果将图片放到drawable—hdpi中则该问题就不会存在了。比如手机屏幕的大小为420*800如果你将图片放在drawable—mdpi中,那么你就要准备一张340*525分辨率的图片,今天我就遇到了,很是让我郁闷当时我还以为屏幕有误差,查阅其他代码后才发现自己把图片放错了位置。

1)不同的layout

Android手机屏幕大小不一,有480×320, 640×360, 800×480.怎样才能让App自动适应不同的屏幕呢?

其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640×360,layout-800×480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

2)hdpi、mdpi、ldpi

在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

  drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

  (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480×800),FWVGA (480×854)

  (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320×480)

  (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240×320)

  系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。

  在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

3)横屏竖屏

以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。

还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。

要让程序界面保持一个方向,不随手机方向转动而变化的处理办法:

在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation=”landscape”。

例如(landscape是横向,portrait是纵向):

 

对于Android游戏开发我们不得不像iPhone那样思考兼容 Android平板电脑,对于苹果要考虑iPad、iPhone 3GS和iPhone 4等屏幕之间的兼容性,对于几乎所有的分辨率总结了大约超过20中粉笔阿女郎的大小和对应关系,对于开发Android游戏而言可以考虑到未来的3.0以及很多平板电脑的需要。

常规的我们可能只考虑QVGA,HVGA,WVGA,FWVGA和DVGA,但是抛去了手机不谈,可能平板使用类似WSVGA的1024×576以及WXGA的1280×768等等。

QVGA = 320 * 240;

WQVGA = 320 * 480;

WQVGA2 = 400 * 240;

WQVGA3 = 432 * 240;

HVGA = 480 * 320;

VGA = 640 * 480;

WVGA = 800 * 480;

WVGA2 = 768 * 480;

FWVGA = 854 * 480;

DVGA = 960 * 640;

PAL = 576 * 520;

NTSC = 486 * 440;

SVGA = 800 * 600;


闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柛顐f磸閳ь兛鐒︾换婵嬪礋椤撶媭妲卞┑鐐存綑閸氬岣垮▎鎴濐棜闁秆勵殕閳锋垶銇勯幒鍡椾壕缂備礁顦顓犲垝婵犳艾鍐€妞ゆ挾鍠撻崢鎼佹⒑閹肩偛鍔楅柡鍛閳挳姊绘担鍛靛綊顢栭崱娑樼闁归棿绀侀悡鈥愁熆鐠虹尨鍔熼柡鍡畵閺屾盯濡烽姀鈩冪彇闂佺粯绋忛崕宕囨閹捐纾兼繛鍡樺俯閸炲綊姊洪柅鐐茶嫰婢ь噣鏌涢悢閿嬪仴妞ゃ垺妫冮、姗€鎮╅顫闁荤喐鐟ョ€氼厾绮堥崘顏嗙<閻犲洩灏欐晶锔筋殽閻愭彃鏆i柛鈺嬬節瀹曘劑顢涘顒傚濠碉紕鍋戦崐鏍箰閻愵剚鍙忛柧蹇e亞椤╂煡鏌曡箛鏇炐涢柡鈧禒瀣厽闁瑰瓨绻冨婵嬫煕閹烘柨顣肩紒缁樼洴瀵爼骞嬪┑鎰磾婵°倗濮烽崑娑氭崲濮椻偓瀵偊骞樼紒妯绘闂佽法鍣﹂幏锟�/QQ 1602007闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏃堟暜閸嬫挾绮☉妯诲櫧闁活厽鐟╅弻鐔告綇妤e啯顎嶉梺鎼炲€栭崝鏍Φ閸曨垰鍐€妞ゆ劦婢€缁爼姊哄ú璇插箺妞ゃ劌鐗撻獮澶岀矙濞嗘儳鎮戞繝銏f硾閿曪箓宕㈠ú顏呪拺闁告繂瀚弳娆撴煟濡も偓濡瑩宕曢锔解拻濞达絿鎳撻婊呯磼鐠囨彃鈧灝鐣烽幇鏉垮窛濠电姴瀚峰ú鎼佹⒑鐠団€崇€婚柍褜鍓熷銊︾鐎n偆鍘藉┑鈽嗗灥濞夋洜鑺遍崸妤佺厱闊洦鎸诲﹢浼存煏閸パ冾伃妤犵偛娲、鏃堝幢濞嗘垵骞嗛梻鍌欑閹碱偊鎯屾径灞惧床婵犻潧妫涢弳锕傛煙閻戞ê鐏嶉柛顐邯楠炴牕菐椤掆偓閻忣亪鏌¢崱娆忎粶闁宠鍨块幃娆忣啅椤斿吋顔嶅┑鐘愁問閸犳骞愰幎钘夌畺鐟滄棃鐛Ο鍏煎珰闁肩⒈鍓涢弳浼存⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛紱闂佸憡娲﹂崹閬嶆偂閿濆鍙撻柛銉e妽鐏忎即鎮归幇鍓佺瘈鐎殿噮鍋婂畷濂稿Ψ閿旇瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟块崥妯衡槈濡粍妫冨畷顏呮媴鐟欏嫭鐝楅梻鍌欑閹测剝绗熷Δ鍛獥婵ǹ缈伴埀顒€鎳樺濠氬Ψ閿旀儳骞愰梻浣规偠閸庮噣寮插☉銏犲嚑闁哄啫鐗婇悡鍐煟閻旂ǹ顥嬮弫鍫ユ⒑閸濆嫯瀚扮紒澶庮潐娣囧﹪鎮滈挊澹┿劑鏌曟径娑㈡闁伙讣缍侀弻锝夋偄閸濄儳鐓佸┑鐘灪閿氶摶鐐翠繆閵堝懏鍣虹紒鐘冲浮濮婄粯鎷呴崨闈涙贡閹广垽骞掑Δ鈧悡鏇㈡煕椤愶絿濡囬柡瀣閺岋繝宕橀妸銉㈠亾瑜版帒绐楅柟鎵閸嬨劍銇勯弽鐢靛埌闁哄鍠栭幃妤€顫濋悙顒€顏�
>更多相关文章
24小时热门资讯
24小时回复排行
闂傚倸鍊搁崐宄懊归崶顒夋晪鐟滃繘鍩€椤掍胶鈻撻柡鍛矌缁參鎮㈤懖鐑樻閸┾偓妞ゆ帒鍠氶弳浼存⒑鐠囨彃顒㈤柛鎰煼楠炲繘鏁撻敓锟� 闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗ù锝堟缁€濠傗攽閻樻彃鈧绱撳杈ㄥ枑闁硅揪绠戞闂佽澹嗘晶妤呭磹閻戣姤鐓熼柕蹇嬪灪閺嗏晠鏌i敐鍛煟婵﹥妞藉Λ鍐ㄢ槈濮樿京鏉介梻浣呵归敃銉ッ洪弽顒備罕婵犵妲呴崹鐢稿磻閹邦儵娑㈩敍濞戞牔绨婚梺瑙勫礃濞夋稒绂掗敃鍌涚厱闁挎繂鎳忛幉鍝ョ磼鏉堛劌娴い銏$懇閹崇偤濡烽妷褝绱﹂梻鍌欑閹碱偊鎯屾径宀€绀婂〒姘e亾鐎规洘妞介弫宥夊礋閵娿儰澹曢梺鎸庣箓妤犲憡绂嶅⿰鍕╀簻闊洢鍎茬€氾拷
闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸崹楣冨箛娴e湱绋佸┑鐘垫暩婵敻鎳濋崜褍顥氬┑鐘崇閻撶喖鏌¢崘銊モ偓鍝ユ暜閸撲胶纾奸柣妯虹-婢ь亪鏌嶇憴鍕伌闁诡喒鏅犻獮鎾诲箳閹炬惌鍞插┑锛勫亼閸婃牕煤濠靛洢浠堥柟闂寸缁犵偤鏌曟繛鍨姶婵炵鍔戦弻娑㈠焺閸愮偓鐣跺銈庡亽娴滎亜顫忓ú顏勪紶闁靛鍎洪埀顒佹崌閺岀喖宕欓妶鍡楊伓 闂傚倸鍊搁崐宄懊归崶顒夋晪鐟滃繘鍩€椤掍胶鈻撻柡鍛Т閻e嘲螣閼姐倗鐦堝┑顔斤供閸樻悂骞愰崘顔解拺闁告稑锕ユ径鍕煕韫囨梻銆掗柟骞垮灲瀹曞崬鈻庨幇顒佺€鹃梻浣告惈閸婂綊顢栧▎鎾冲惞闁哄洢鍨洪悡鐔兼煏韫囨洖孝妞ゃ儱绻橀弻鈩冩媴閸濄儛锝夋煙娓氬灝濡兼い顐g矒瀹曞崬螖閳ь剟锝為锔解拺闁告稑顭€閹寸姵鏆滄俊銈呭暞瀹曞弶绻涢幋娆忕仼缂佺媴缍侀弻锝夊箛椤撶喓绋囬梻鍌氼槸缁夊墎妲愰幘瀵哥懝闁搞儜鍕邯缂傚倷绀侀ˇ閬嶅箠閹炬椿鏁嬮柨婵嗘缁♀偓濠殿喗锕╅崢鍏肩濠婂牊鈷戠紒瀣硶缁犳娊鏌涘Ο鐘插暊閺嬫棃鐓崶銊р姇闁抽攱鍨块弻娑樷攽閸℃浠奸梺鍝勬閻熲晠寮诲☉娆戠瘈闁稿本绋栫涵鈧紓鍌欑贰閸犳牠鎮ч幘璇叉瀬闁瑰墽绮弲鎼佹煥閻曞倹瀚�
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2025 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();