Bitmap和Drawable浅谈

、概念区别

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

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

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

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

二、Android读取不同位置(drawableassetSDCard)的图片资源

方式一:

已将图片保存到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;

ps:

Android开发过程中,遇到的这个问题真的把人搞死了,客户一直不爽那个启动图标,换了好几个手机测试,每个手机都有自己的渲染效果

让人郁闷的要死啊,关于这点一定要好好的注意下,小米手机渲染和三星手机完全就是两回事

Android开发---图片渲染问题----真的很严重相关推荐

  1. android图片底部居中对齐,android开发图片居中的小技巧

    释放双眼,带上耳机,听听看~! 制作UI布局的时候都会出现复杂的LinearLayout嵌套,并且常常会被一些问题混淆,警惕在android中图片居中的小技巧大家都知道吗?别着急,下文是技术狗小编为大 ...

  2. 作为Android开发师,你真的懂怎么读源码吗?

    前言 对于许多Android开发者来说,所谓的Android工程师的工作"不过就是用XML实现设计师的美术图,用JSON解析服务器的数据,再把数据显示到界面上"就好了,源码什么的, ...

  3. Android开发图片开源系列框架

    文章目录 1.图片加载,缓存,处理 2.图片裁剪 3.图片选择 4.图片转换,压缩,滤镜 5.高斯模糊,毛玻璃,图片模糊 1.图片加载,缓存,处理 框架名称 : Android Universal I ...

  4. android开发图片格式,Android程序开发如何处理图像格式类及图像转换

    在Android程序开发过程中,明确哪些图像格式类(ImageFormat.PixelFormat及BitmapConfig等)及图像(JPG.PNG及BMP等)的转换方式非常重要,在以后的程序开发过 ...

  5. 做一个高一致性、高性能的Flutter动态渲染,真的很难么?

    Flutter动态模板渲染架构升级 ​ 最近小组在尝试使用集团DinamicX的DSL,通过下发DSL模板,实现Flutter端的动态化模板渲染.我们解决了性能方面的问题后,又面临了一个新的挑战--渲 ...

  6. android开发图片自适应,android中用.9.patch的图片实现图片自适应

    1,如何实现图片自适应 如何实现图片自适应,我们用.9.patch, 左侧和上侧的直线共同决定了图片的缩放区域,左侧边直线绘制的区域决定了纵向缩放的区域:上侧直线绘制的区域决定了水平方向可以缩放的区域 ...

  7. android开发图片自适应高度,recyclerview实现瀑布流图片自适应高度

    recyclerview实现瀑布流图片自适应高度 recyclerview实现瀑布流图片自适应高度 1::Recyclerview配置适配器 StaggeredGridLayoutManager gr ...

  8. android开发 图片浏览器,Android开发之图片浏览器

    Android图片浏览器,可以调整图片透明度和按顺序切换图片. 以下是activity的xml文件: xmlns:tools="http://schemas.android.com/tool ...

  9. 这些酷酷的文字特效图片,制作真的很简单!

    经常刷朋友圈的童鞋 可能你们会见过这种文字特效图片 ▼ 以上这种图片形式被人们称之为"文字云" 这种极具视觉冲击力的文字展现形式 深受大量用户们的喜爱! 对于新媒体及内容运营来说 ...

最新文章

  1. 博客网站没落的两个原因
  2. VB如何读取快捷方式的目标路径
  3. open表和closed表_什么是左外连接?左外连接在工作表查询中的应用
  4. Educoder Basemap和Seaborn 第一关:Seaborn
  5. @PreDestroy 为什么不执行
  6. 多线程生产者,消费者例题
  7. 用SQLAlchemy执行原生SQL
  8. 数据存储: CheckBoxPreference
  9. 编译android vendor,Android ----制作自己的Vendor
  10. Erlang 游戏开发经验总结
  11. 微信小程序给用户发红包
  12. 采蘑菇电脑c语言,英菲尼迪终于升级英菲尼迪Q50L,内行人告诉你怎么选还配备主动降噪、胎压显示!凯美瑞都比不上它! 早买早享受...
  13. 在同一局域网中使用电脑访问手机内容
  14. MySql 存储boolean的数据
  15. 计算机专业不会编程怎么找工作?
  16. matlab 颜色对应三原色(转)
  17. 运用BFS算法实现北京地铁路线换乘系统
  18. 安卓游戏--浅塘之辅助开发(C/S模式)
  19. 深度学习基本知识(一)评价方法precision\recall\mAP
  20. 可行性研究报告-机房收费系统

热门文章

  1. es6 语法简单使用
  2. 中国自由软件推广先锋的自述,心潮澎湃的一往无前,一定要看!作者:洪峰...
  3. RichEdit控件设置默认字体时只对中文起作用,对英文不起作用的解决办法
  4. photoshop发光线条教程集
  5. 上海叮咚买菜抢菜程序
  6. 游戏开发、安卓、IOS知识概括
  7. 今日头条前端三轮面试面经
  8. Windows server 2012 R2添加桌面图标(计算机、控制面板、网络等)
  9. cadence logic 库说明
  10. 四中矩阵相乘方法对比