`
zhuangshuo
  • 浏览: 20590 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android Drawable Bitmap

 
阅读更多
1.Drawable—>Bitmap

Resources res=getResources();
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.sample_0);



2.Bitmap---->Drawable

Drawable drawable =new BitmapDrawable(bmp);



另外在网上搜了些,也不知到底谁是原创的

1、Drawable → 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;

                    }

          }



系列连续的图片,img_0.png, img_1.png, img_2.png ...
如果要动态获取这些图片,通过"R.drawable.img_x"的ID方式指定是不行的,因为这个ID无法动态变化,即你是无法通过字符串拼接的方法来实现的。

但可以通过下面方式获取:

String imgname = "img_" + idx;
int imgid = getResources().getIdentifier(imgname, "drawable", "com.vtion.sleb.activities");
EditText.setBackgroundResource(imgid);
根据传递的idx的值不同,就可以动态的获取img_x所对应名称的图片资源了。

参数:imgname:为drawable文件夹中图片的名称--不包括后缀.png   .jpg 等。

其中"com.vtion.sleb.activities"指的是你的package name,就是Java文件最开始一行的那个。



一、概念区别
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;


package com.vtion.sleb.banca.utils;  
   
import java.io.ByteArrayOutputStream;  
import java.io.InputStream;  
   
import android.content.Context;  
import android.content.res.AssetManager;  
import android.content.res.Resources;  
import android.graphics.Bitmap;  
import android.graphics.BitmapFactory;  
import android.graphics.Canvas;  
import android.graphics.PixelFormat;  
import android.graphics.drawable.BitmapDrawable;  
import android.graphics.drawable.Drawable;  
   
public class BitmapUtil {  
   
    /** 
     *  Drawble转Bitmap 
     * @param drawable   
     * @return 
     */ 
    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;  
    }  
   
    /** 
     *  从资源中获取Bitmap 
     * @param context  上下文 
     * @param id       Drawable的id    R.id.xxx 
     * @return 
     */ 
    public static Bitmap getBitmapFromRes(Context context, int id) {  
        Resources res = context.getResources();  
        Bitmap bmp = BitmapFactory.decodeResource(res, id);  
        return bmp;  
   
    }  
   
    /** 
     *  Bitmap → byte[] 
     * @param bm 
     * @return 
     */ 
    private byte[] Bitmap2Bytes(Bitmap bm) {  
        ByteArrayOutputStream baos = new ByteArrayOutputStream();  
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);  
        return baos.toByteArray();  
    }  
   
    /** 
     *  byte[] → Bitmap 
     * @param b 
     * @return 
     */ 
    private Bitmap Bytes2Bimap(byte[] b) {  
        if (b.length != 0) {  
            return BitmapFactory.decodeByteArray(b, 0, b.length);  
        } else {  
            return null;  
        }  
    }  
   
    /** 
     * 将assets文件中资源取出,并将图片从bitmap转换成drawable格式 
     * @param context 
     * @param fileName 
     * @return 
     */ 
    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;  
    }  
}



文献:http://www.2cto.com/kf/201309/241750.html
分享到:
评论

相关推荐

    Android Drawable Bitmap 相互转换

    在Android开发中,Drawable和Bitmap是两种常用的图像资源类型,它们各有特点且在不同场景下有不同的优势。了解和掌握它们之间的相互转换对于优化性能和提高用户体验至关重要。本篇将详细介绍如何在Android中进行...

    Drawable Bitmap之间的转化

    本文将详细介绍如何在Android中实现`Drawable`与`Bitmap`之间的相互转换,并探讨这两种类型的图像数据在实际应用中的应用场景。 #### 一、Drawable简介 `Drawable`是Android中用于表示图形的一种抽象类,它可以是...

    Android Drawable、Bitmap、byte、灰度 转换

    在Android开发中,图片资源的处理是常见的需求之一,涉及到多种数据类型之间的转换,包括`Drawable`、`Bitmap`、`byte[]`等。本文将详细介绍这些类型之间的转换方法,以及如何实现灰度图像的转换。 ### 1. `...

    Android Drawable、Bitmap、byte、灰度 之间的转换

    在Android开发中,图片资源的处理是常见的需求之一,尤其涉及到不同格式间的转换,如Drawable、Bitmap、byte数组以及灰度图像的转换。这些转换在实际应用中具有重要意义,不仅能够优化内存使用,还能实现图像的高效...

    Android Drawable和Bitmap的转换实例详解

    Android Drawable和Bitmap的转换实例详解 通常我们需要通过代码去设置图片,就需要设置图片Bitmap和Drawable的转换,下面整理了几种方式 一、Bitmap转Drawable Bitmap bm=xxx; //xxx根据你的情况获取 ...

    Android Bitmap和Drawable相互转换的简单代码

    很多开发者表示,不知道Android的Drawable和Bitmap之间如何相关转换。下面Android123给大家两种比较简单高效的方法。  一、Bitmap转Drawable 代码如下: Bitmap bm=xxx; //xxx根据你的情况获取  BitmapDrawable bd...

    Drawable Bitmap InputStream byte[]相互转化工具类

    在Android开发中,处理图像数据时,我们经常需要在Drawable、Bitmap、InputStream和byte数组之间进行转换。这些类型的转换在不同的场景下具有重要的作用,例如从网络加载图片、存储图片到本地或者显示在ImageView上...

    android_Drawable、Bitmap、byte[]之间的转换.doc

    ### Android中Drawable、Bitmap与byte[]之间的转换 在Android应用开发过程中,经常需要对图像资源进行处理,这就涉及到了不同图像格式之间的转换。本文将详细介绍`Drawable`、`Bitmap`及`byte[]`三者之间的转换方法...

    Android Drawable 各种高效用法

    4. **位图Drawable(Bitmap Drawable)**: 这是最常见的Drawable类型,用于加载和显示位图图像。可以通过设置缩放类型、裁剪模式和边框等属性来调整位图的显示效果。 5. **形状Drawable(Shape Drawable)**: ...

    android 画图 bitmap drawable canvas paint

    在Android平台上,绘制图形是一项基本任务,涉及到多个关键类,如Bitmap、Drawable和Canvas,以及Paint。这些类共同构成了Android图形系统的核心,使得开发者能够创建丰富的用户界面和自定义视图。 首先,Bitmap是...

    android drawable

    1. **Bitmap Drawable**:基于位图图像(如PNG、JPEG或SVG)的`Drawable`,是最常见的类型。 2. **Vector Drawable**:用于表示矢量图形,可以在不同分辨率的设备上保持清晰,特别适合图标和图形。 3. **Shape ...

    Android Drawable 全部 xml 元素和属性用法

    - `android:tileMode`: 对Bitmap Drawable启用平铺模式,如"disabled", "repeat", 或 "mirror"。 - `android:alpha`: 控制Drawable的透明度,范围从0.0(完全透明)到1.0(完全不透明)。 4. **组合和使用...

    Android中区别Drawable Bitmap Canvas Paint

    本文主要介绍Android中Drawable Bitmap Canvas Paint 之间的区别,这里对这几个概念做出详细介绍,开发Android游戏的朋友可以参考下

    Android drawable 玩转自定义图片以及bug的解决

    在Android开发中,Drawable是图形资源的核心组成部分,用于在屏幕上绘制图像。自定义drawable不仅可以提升应用的视觉效果,还能实现一些复杂的功能需求。本篇文章将深入探讨如何在Android中玩转自定义图片,并解决...

    android中的drawable集合

    在Android开发中,Drawable是图形和图像处理的重要组成部分,它是一种可以绘制到Canvas上的对象,广泛用于界面元素的装饰和状态表示。以下是对Android中drawable集合的详细解释: 1. **Bitmap Drawable**: Bitmap ...

    Android下利用Bitmap切割图片

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image); ``` 接下来,我们讨论如何切割图片。切割图片通常指的是从原始图片中提取出一个矩形区域,这个操作在Android中可以通过...

    自定义Drawable 实现图片圆角、圆形、椭圆形

    在Android开发中,自定义Drawable是提升应用UI个性化和性能优化的重要手段。本文将深入探讨如何通过自定义Drawable实现图片的圆角、圆形以及椭圆形显示,帮助开发者更好地理解和运用这一技术。 首先,我们了解...

    Android App开发中将View或Drawable转为Bitmap的方法

    在Android应用开发中,将View或Drawable转换为Bitmap是一项常见的需求。这主要涉及到视图的渲染和图像处理,常用于截图、自定义视图动画、数据记录等多种场景。以下是关于如何进行这种转换以及解决相关问题的详细...

    android Bitmap用法总结

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

    Android Bitmap和Drawable的对比

    Android Bitmap和Drawable的对比 Android Bitmap和Drawable是Android平台中两种常见的图形对象,虽然它们都可以用来显示图像,但是它们之间有着很大的区别。本文将对Android Bitmap和Drawable进行对比,帮助开发者...

Global site tag (gtag.js) - Google Analytics