當前位置:首頁 » 安卓系統 » androidbitmap創建

androidbitmap創建

發布時間: 2023-04-04 18:08:22

A. android怎麼生成bitmap

1、

[java] view plain
public Bitmap convertViewToBitmap(View view){

Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.ARGB_8888);
//利用bitmap生成畫布
Canvas canvas = new Canvas(bitmap);

//把view中的內容繪制在畫布上
view.draw(canvas);

return bitmap;
}

2、

[java] view plain
/**
* save view as a bitmap
*/
private Bitmap saveViewBitmap(View view) {
// get current view bitmap
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(true);
Bitmap bitmap = view.getDrawingCache(true);

Bitmap bmp = plicateBitmap(bitmap);
if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); bitmap = null; }
// clear the cache
view.setDrawingCacheEnabled(false);
return bmp;
}

public static Bitmap plicateBitmap(Bitmap bmpSrc)
{
if (null == bmpSrc)
{ return null; }

int bmpSrcWidth = bmpSrc.getWidth();
int bmpSrcHeight = bmpSrc.getHeight();

Bitmap bmpDest = Bitmap.createBitmap(bmpSrcWidth, bmpSrcHeight, Config.ARGB_8888); if (null != bmpDest) { Canvas canvas = new Canvas(bmpDest); final Rect rect = new Rect(0, 0, bmpSrcWidth, bmpSrcHeight);

canvas.drawBitmap(bmpSrc, rect, rect, null); }

return bmpDest;
}

B. android圖像繪制——畫布保存為圖片

解釋:

1、首先創建一個Bitmap圖片,並指定大小;

2、在該圖片上創建一個新的畫布Canvas,然後在畫布上繪制,並保存即可;

3、需要保存的目錄File,注意如果寫的目錄如「/sdcard/akai/」如果不存在的話,要先創建(file.mkdirs()),否則FileOutputStream會報錯No found;

4、需要添加許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

什麼是畫布呢 其實通過字面意思的理解就是用來繪畫的地方,那麼android里的畫布是神馬樣子的呢?

在自定義畫布中常用到下面3個類

Canvas

這些繪圖方法中的每一個都需要指定一個Paint對象來渲染它

Paint

Paint也稱為"刷子",Paint可以指定如何將基本圖形繪制到點陣圖上。

Paint類相當於一個筆刷和調色板。它可以選擇如何使用上面描述的draw方法來渲染繪 制在畫布上的基本圖形。通過修改Paint對象,可以在繪圖的時候控制顏色、樣式、字體和特殊效果。最簡單地,setColor可以讓你選擇一個Paint的顏色,而Paint對象的樣式(使用setStyle控制)則可以決定是繪制繪圖對象的輪廓(STROKE),還是只填充每一部 分(FILL),或者是兩者都做(STROKE_AND_FILL)除了這些簡單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進行修改,從而提供由更豐富的、復雜的畫筆和顏料組成的調色板。

從繼承View類(或其子類)開始,並定義onDraw()回調方法。系統會調用該方法來完 成View對象自己的繪制請求。這也是通過Canvas對象來執行所有的圖形繪制調用的地方,這個Canvas對象是由onDraw()回調方法傳入的。

Android框架只在必要的時候才會調用onDraw()方法,每次請求應用程序准備完成圖形 繪制任務時,必須通過調用invalidate()方法讓該View對象失效。這表明可以在該View 對象上進行圖形繪制處理了,然後Android系統會調用該View對象的onDraw()方(盡 管不保證該回調方法會立即被調用)。

在定製的View組件的onDraw()方法內部,使用給定的Canvas對象來完成所有的圖形繪制處理(如Canvas.draw…()方法或把該Canvas對象作為參數傳遞給其他類的draw() 方法)。一旦onDraw()方法被執行完成,Android框架就會使用這個Canvas對象來繪制一個有系統處理的Bitmap對象。

下面是Paint一些常用方法:

Bitmap

Bitmap繪圖的表面也稱點陣圖(這里詳細說哈點陣圖的功能)。

從資源中獲取點陣圖:

通過Resource的函數:InputStream openRawResource(int id)獲取得到資源文件的數據流後,可以通過2種方式獲得bitmap

使用BitmapDrawable :

使用BitmapDrawable(InputStream is)構造一個BitmapDrawable;

使用BitmapDrawable類的getBitmap()獲取得到點陣圖;

使用BitmapFactory使用BitmapFactory類decodeStream(InputStream is)解碼位 圖資源,獲取點陣圖BitmapFactory的所有函數都是static,這個輔助類可以通過資 源ID、路徑、文件、數據流等方式來獲取點陣圖。

獲取點陣圖的信息

一般獲取點陣圖信息包括:點陣圖大小、透明度、顏色格式等等,這些信息呢可以通過 三-一方法獲取得到Bitmap就迎刃而解了,Android SDK中對Bitmap有詳細說明,大家可以去詳細了解哈。

顯示點陣圖

顯示點陣圖需要使用核心類Canvas,可以直接通過Canvas類的drawBirmap()顯示點陣圖,或者藉助於BitmapDrawable來將Bitmap繪制到Canvas,下面的實例中會詳細列舉到

點陣圖的縮放

點陣圖的縮放,在Android SDK中提供了2種方法:

1:將一個點陣圖按照需求重畫一遍,畫後的點陣圖就是我們需要的了,與點陣圖的顯示幾乎 一樣:
drawBitmap(Bitmap bitmap, Rect src, Rectdst, Paint paint)

2:在原有點陣圖的基礎上,縮放原點陣圖,創建一個新的點陣圖:
createBitmap(Bitmap source, int x, int y,int width, int height, Matrix m, boolean filter)

點陣圖旋轉

點陣圖的旋轉,離不開Matrix。Android SDK提供了Matrix類,可以通過各種介面來設置 矩陣

android 處理圖片工具

截取視頻幀並轉化為Bitmap

C. android 如何創建一張透明bitmap

使用一張全透明的PNG圖片作為drawable,將它轉換為bitmap即可。

D. android bitmap怎麼創建canvas

點陣圖是我們開發中最常用的資源,畢竟一個漂亮的界面對用戶是最有吸引力的。

1. 從資源中獲取點陣圖

可以使用BitmapDrawable或者BitmapFactory來獲取資源中的點陣圖。

當然,首先需要獲取資源:
Resources res=getResources();

復制代碼
使用BitmapDrawable獲取點陣圖

1. 使用BitmapDrawable (InputStream is)構造一個BitmapDrawable;
2. 使用BitmapDrawable類的getBitmap()獲取得到點陣圖;
// 讀取InputStream並得到點陣圖

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

BitmapDrawable bmpDraw=new BitmapDrawable(is);

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中顯示
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(Bitmapbitmap, 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:
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來實現。
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);

旋轉效果:


6.圖片水印的生成方法
生成水印的過程。其實分為三個環節:第一,載入原始圖片;第二,載入水印圖片;第三,保存新的圖片。

/**
* create the bitmap from a byte array
*
* @param src the bitmap object you want proecss
* @param watermark the water mark above the src
* @return return a bitmap object ,if paramter's length is 0,return null
*/
private Bitmap createBitmap( Bitmap src, Bitmap watermark )
{
String tag = "createBitmap";
Log.d( tag, "create a new bitmap" );
if( src == null )
{
return null;
}

int w = src.getWidth();
int h = src.getHeight();
int ww = watermark.getWidth();
int wh = watermark.getHeight();
//create the new blank bitmap
Bitmap newb = Bitmap.createBitmap( w, h, Config.ARGB_8888 );//創建一個新的和SRC長度寬度一樣的點陣圖
Canvas cv = new Canvas( newb );
//draw src into
cv.drawBitmap( src, 0, 0, null );//在 0,0坐標開始畫入src
//draw watermark into
cv.drawBitmap( watermark, w - ww + 5, h - wh + 5, null );//在src的右下角畫入水印
//save all clip
cv.save( Canvas.ALL_SAVE_FLAG );//保存
//store
cv.restore();//存儲
return newb;
}


7.Canvas的save和restore
onDraw方法會傳入一個Canvas對象,它是你用來繪制控制項視覺界面的畫布。
在onDraw方法里,我們經常會看到調用save和restore方法,它們到底是干什麼用的呢?
❑ save:用來保存Canvas的狀態。save之後,可以調用Canvas的平移、放縮、旋轉、錯切、裁剪等操作。
❑ restore:用來恢復Canvas之前保存的狀態。防止save後對Canvas執行的操作對後續的繪制有影響。
save和restore要配對使用(restore可以比save少,但不能多),如果restore調用次數比save多,會引發Error。save和restore之間,往往夾雜的是對Canvas的特殊操作。
例如:我們先想在畫布上繪制一個右向的三角箭頭,當然,我們可以直接繪制,另外,我們也可以先把畫布旋轉90°,畫一個向上的箭頭,然後再旋轉回來(這種旋轉操作對於畫圓周上的標記非常有用)。然後,我們想在右下角有個20像素的圓,那麼,onDraw中的核心代碼是:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// Draw background
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// Draw up arrow
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// Draw circle
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
效果如圖1所示:

如果我們不調用save和restore會是什麼樣子呢?如圖2所示:

從這兩個圖中,我們就能看到圓圈位置的明顯差異。不進行Canvas的save和restore操作的話,所有的圖像都是在畫布旋轉90°後的畫布上繪制的。當執行完onDraw方法,系統自動將畫布恢復回來。save和restore操作執行的時機不同,就能造成繪制的圖形不同。

E. 關於Android系統一次能創建多大的Bitmap

實際操作來看應該是正確的,且看如下實驗:
在創建Bitmap是無論將其width和height初始化多麼大,只要不執行繪圖操作,都不會報OOM(out of memory)錯誤
通過Config.ALPHA_8單位元組設置Bitmap,最後生成的圖片只有一個黑色背景
通過Config.ARGB_4444兩個位元組設置,width*height 最大可以初始化到1006*1006*8,才能保證在繪圖時不提示錯誤
通過Config.ARGB_8888四個位元組設置,width*height 最大可以初始化到1006*1006*4,才能保證在繪圖時不提示錯誤
在上面極限測試過程中,僅能保證第一次繪圖操作正確,再來一次就OOM了
所以由此可以得出如下結論:
Bitmap在創建時是沒有分配內存的(當然了,如果是通過decode方法直接解析圖像文件,應該是會即時分配的;網上一位高手說Android系統一次能讀取的最大文件大小為1M,本人尚未驗證)
1006*1006*8*2大約等於16M

F. Android Bitmap詳解

Bitmap是Android系統中圖像處理的最重要類之一。用它可以獲取圖像信息,對圖像進行剪切、旋轉、縮放等操作,並可以指定格式保存圖像文件。

以in開頭的都是設置屬性值,以out開頭的都是獲取屬性值。

Bitmap的載入獲取方式主要有有從Resource資源載入、本地SD卡載入及網路載入等方式。

使用BitmapFactory.decodeResource方式載入圖片如果要經過縮放,該縮放是在java層進行的,效率比較低,會消耗java層的內存,因此如果大量使用會導致OOM。

BitmapFactory.decodeStream一般用於二進制文件圖片的讀取。

從網路載入圖片本質上也是從網路讀取圖片數據流,通過BitmapFactory.decodeStream方式載入圖片。

其他的轉換就不一一列舉了,不能直接轉換的可以間接進行轉換。

在拍照上傳圖片過程中,我們可能會遇到上傳的圖片被旋轉了,需要給他復原進行旋轉。

獲取圖片的旋轉角度:

熱點內容
沒簽名只加密 發布:2025-07-04 18:54:38 瀏覽:254
紅米手機存儲問題 發布:2025-07-04 18:50:43 瀏覽:841
水電煤演算法 發布:2025-07-04 18:36:44 瀏覽:329
天翼視訊緩存文件夾 發布:2025-07-04 18:36:43 瀏覽:96
unix網路編程第2卷 發布:2025-07-04 18:33:41 瀏覽:782
編譯歷史 發布:2025-07-04 18:23:01 瀏覽:851
空調壓縮機種類 發布:2025-07-04 18:13:58 瀏覽:242
中國有ip6伺服器嗎 發布:2025-07-04 17:58:56 瀏覽:726
第六章編譯原理答案 發布:2025-07-04 17:37:55 瀏覽:40
php內存優化 發布:2025-07-04 17:25:54 瀏覽:664