Android中 Bitmap Drawable Paint的獲取、轉換以及使用

好比Drawable中有一系列連續的圖片,img_0.png, img_1.png, img_2.png ...
若是要動態獲取這些圖片,經過"R.drawable.img_x"的ID方式指定是不行的,由於這個ID沒法動態變化,即你是沒法經過字符串拼接的方法來實現的。

但能夠經過下面方式獲取:
java

String imgname = "img_" + idx;
int imgid = getResources().getIdentifier(imgname, "drawable", "com.vtion.sleb.activities");
EditText.setBackgroundResource(imgid);
android

根據傳遞的idx的值不一樣,就能夠動態的獲取img_x所對應名稱的圖片資源了。canvas

參數:imgname:爲drawable文件夾中圖片的名稱--不包括後綴.png   .jpg 等。工具

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


 

1、概念區別編碼

Bitmap - 稱做位圖,通常位圖的文件格式後綴爲bmp,固然編碼器也有不少如RGB56五、RGB8888。做爲一種逐像素的顯示對象執行效率高,可是缺點也很明顯存儲效率低。咱們理解爲一種存儲對象比較好。spa

Drawable - 做爲Android平下通用的圖形對象,它能夠裝載經常使用格式的圖像,好比GIF、PNG、JPG,固然也支持BMP,固然還提供一些高級的可視化對象,好比漸變、圖形等。code

Canvas - 名爲畫布,咱們能夠看做是一種處理過程,使用各類方法來管理Bitmap、GL或者Path路徑,同時它能夠配合Matrix矩陣類給圖像作旋轉、縮放等操做,同時Canvas類還提供了裁剪、選取等操做。orm

Paint - 咱們能夠把它看作一個畫圖工具,好比畫筆、畫刷。他管理了每一個畫圖工具的字體、顏色、樣式。xml


2、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()));


3、DrawableBitmapbyte[]之間的轉換

1)      DrawbleBitmap

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;

}

4、APK程序裏的drawablehdpidrawablemdpidrawableldpi詳解

本身DIYAPK程序的達人們確定會對於android中放置圖片的地方drawablehdpidrawablemdpidrawableldpi這三個感到好奇。確定內心會想,放在哪個都行,只要是在android中的res目錄下的drawable中就行,系統會本身找到。有心的朋友確定會他把弄個究竟。我之前對drawablehdpidrawablemdpidrawableldpi這三個也瞭解了一下,可是隻是字面上的,沒有真正理解透徹,到今天我纔算有稍深點的理解。drawablehdpi看他的單詞名確定知道他是放置高分辨率的圖片,drawablemdpi放置中等分辨率的圖片,drawableldpi放置低分辨率的圖片。大部分人都把的圖片放在drawablemdpi中。起初我認爲隨便將圖片放置在三個當中的任意一個都行,可是今天我知道了。在分辨率低於480*800時把圖片放在drawablemdpi中是不會有什麼影響,可是當分辨率爲420*800或高於它時就會出問題了。你的手機屏幕有那麼大可是他會將圖片拉伸,當加載圖片後讓你感受該屏幕沒有實際的大小,而若是將圖片放到drawablehdpi中則該問題就不會存在了。好比手機屏幕的大小爲420*800若是你將圖片放在drawablemdpi中,那麼你就要準備一張340*525分辨率的圖片,今天我就遇到了,非常讓我鬱悶當時我還覺得屏幕有偏差,查閱其餘代碼後才發現本身把圖片放錯了位置。

1)不一樣的layout

Android手機屏幕大小不一,有480×320, 640×360, 800×480.怎樣才能讓App自動適應不一樣的屏幕呢?

其實很簡單,只須要在res目錄下建立不一樣的layout文件夾,好比layout-640×360,layout-800×480,全部的layout文件在編譯以後都會寫入R.java裏,而系統會根據屏幕的大小本身選擇合適的layout進行使用。

2hdpimdpildpi

在以前的版本中,只有一個drawable,而2.1版本中有drawable-mdpidrawable-ldpidrawable-hdpi三個,這三個主要是爲了支持多分辨率。

drawable- hdpidrawable- mdpidrawable-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平板電腦,對於蘋果要考慮iPadiPhone 3GSiPhone 4等屏幕之間的兼容性,對於幾乎全部的分辨率總結了大約超過20中粉筆阿女郎的大小和對應關係,對於開發Android遊戲而言能夠考慮到將來的3.0以及不少平板電腦的須要。

常規的咱們可能只考慮QVGAHVGAWVGAFWVGADVGA,可是拋去了手機不談,可能平板使用相似WSVGA1024×576以及WXGA1280×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;
	}
}
相關文章
相關標籤/搜索