『壹』 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
『貳』 如何讓Android以原始解析度保存在Bitmap中
可以做到網上有很多方法可以找一下
『叄』 怎樣把bitmap圖片存儲到圖庫的指定相冊裡面 安卓
android把Bitmap圖片保存到指定相冊中,具體實現方法如下:
/** 保存方法 */
public void saveBitmap() {
Log.e(TAG, "保存圖片");
File f = new File("/sdcard/namecard/", picName);
if (f.exists()) {
f.delete();
}
try {
FileOutputStream out = new FileOutputStream(f);
bm.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
Log.i(TAG, "已經保存");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
還需要兩個許可權:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
『肆』 Android Bitmap理解
參考:
Android Bitmap 詳解:關於 Bitamp 你所要知道的一切
Android Bitmap(點陣圖)詳解
圖片是由大量且有限個數的像素點組成。把一張圖片通過bitmap的方式創建到內存中,實際上就是在內存中創建了一個叫做Bitmap的對象,然後把 圖片所有像素 解碼後的數據存放在Bitmap對象裡面,Bitmap就擁有了圖片的寬高,透明度,顏色值等數據。所以Bitmap的創建是通過BitmapFactory.decodeXxx()。
Config是Bitmap類中的枚舉類。像素由ARGB四個顏色通道組成。Config描述點陣圖中像素的存儲方式。 這里的存儲方式,無非就是對顏色通道和用多大的容器(bit)來存儲的排列組合。所以config會影響圖片透明度,佔用內存大小,保存成文件的大小,圖片質量。
Config的字母表示該配置存儲的像素的顏色通道,數字表示對應通道的數據用多少位來存儲。
ALPHA_8:表示只存儲alpha通道,使用8bit(1位元組)的內存(容器)來存儲一個像素。
RGB_565:表示存儲RGB三個通道,分別使用5bit,6bit,5bit的內存(容器)來存儲一個像素。
ARGB_4444:表示存儲ARGB四個通道,每個通道都是以4bit的內存(容器)來存儲一個像素。
ARGB_8888:表示存儲ARGB四個通道,每個通道都是以8bit的內存(容器)來存儲一個像素。
所以,ARGB_8888配置佔用內存最大,圖片質量最高。
圖片壓縮的一個思路就是降低圖片的配置。
總內存 = 寬的像素數 × 高的像素數 × 每個像素點佔用的大小
註:
1 byte = 8 bit
1 KB = 1024 byte
『伍』 android中Bitmap存為一張圖片
可以用Bitmap.compress函數來把Bitmap對象保存成PNG或JPG文件,然後可以用BitmapFactory把文件中的數據讀進來再生成Bitmap對象。
保存的代碼大概類似於這樣:
try {
FileOutputStream out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
具體的可以去查Bitmap和BitmapFactory的幫助文檔。
『陸』 請問在android 編程,Bitmap 怎麼轉換成 file
static boolean saveBitmap2file(Bitmap bmp,String filename){
CompressFormat format= Bitmap.CompressFormat.JPEG;
int quality = 100;
OutputStream stream = null;
try {
stream = new FileOutputStream("/sdcard/" + filename);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bmp.compress(format, quality, stream);
}
stream = new FileOutputStream("/sdcard/" + filename);
獲取要保存到的文件的文件流
bmp.compress(format, quality, stream);
把指定的bitmp壓縮到文件中 就是保存在指定文件中 format是文件格式(Bitmap.CompressFormat.JPEG jpeg) quality 是品質(100 就是原質量)
看名字 saveBitmap2file
你要上傳的話 就去指定位置取這個file就行 路徑的問題 可能有寫真機找不到/sdcard/
建議 Environment類取地址 保存和讀取時 都用Environment.getXXXX
『柒』 android中將bitmap保存為一個普通的圖片文件後,在模擬器上查看不到,但是重啟模擬器就可以看到。求牛人解
需要在模擬器上上dev tools里media scanner下,這樣圖片就會重新載入了
『捌』 android 堆棧類 保存bitmap 如何實現
保存bitmap幹嘛……那肯定會OOM的。保存的應該是Path 才對。
java">privatevoindo(){
if(MyPathList.size()>0){
mCanvas.drawColor(0xFFFFFFFF);
for(inti=0;i<MyPathList.size()-1;i++){
Pathp=(Path)MyPathList.get(i);
mCanvas.drawLine(0,0,20,20,mPaint);
mCanvas.drawLine(0,0,80,20,mPaint);
mCanvas.drawPath(p,mPaint);
p.reset();
}
invalidate();
}
}
『玖』 android bitmap保存為file文件,並更新到圖庫
第一步:
第二步:
第三步:
『拾』 android bitmap怎麼做緩存
Bitmap是Android系統中的圖像處理的最重要類之一。用它可以獲取圖像文件信息,進行圖像剪切、旋轉、縮放等操作,並可以指定格式保存圖像文件。
重要函數
public void recycle() // 回收點陣圖佔用的內存空間,把點陣圖標記為Dead
public final boolean isRecycled() //判斷點陣圖內存是否已釋放
public final int getWidth()//獲取點陣圖的寬度
public final int getHeight()//獲取點陣圖的高度
public final boolean isMutable()//圖片是否可修改
public int getScaledWidth(Canvas canvas)//獲取指定密度轉換後的圖像的寬度
public int getScaledHeight(Canvas canvas)//獲取指定密度轉換後的圖像的高度
public boolean compress(CompressFormat format, int quality, OutputStream stream)//按指定的圖片格式以及畫質,將圖片轉換為輸出流。
format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:畫質,0-100.0表示最低畫質壓縮,100以最高畫質壓縮。對於PNG等無損格式的圖片,會忽略此項設置。
public static Bitmap createBitmap(Bitmap src) //以src為原圖生成不可變得新圖像
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)//以src為原圖,創建新的圖像,指定新圖像的高寬以及是否可變。
public static Bitmap createBitmap(int width, int height, Config config)——創建指定格式、大小的點陣圖
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source為原圖,創建新的圖片,指定起始坐標以及新圖像的高寬。
BitmapFactory工廠類:
Option 參數類:
public boolean inJustDecodeBounds//如果設置為true,不獲取圖片,不分配內存,但會返回圖片的高度寬度信息。
public int inSampleSize//圖片縮放的倍數
public int outWidth//獲取圖片的寬度值
public int outHeight//獲取圖片的高度值
public int inDensity//用於點陣圖的像素壓縮比
public int inTargetDensity//用於目標點陣圖的像素壓縮比(要生成的點陣圖)
public byte[] inTempStorage //創建臨時文件,將圖片存儲
public boolean inScaled//設置為true時進行圖片壓縮,從inDensity到inTargetDensity
public boolean inDither //如果為true,解碼器嘗試抖動解碼
public Bitmap.Config inPreferredConfig //設置解碼器
public String outMimeType //設置解碼圖像
public boolean inPurgeable//當存儲Pixel的內存空間在系統內存不足時是否可以被回收
public boolean inInputShareable //inPurgeable為true情況下才生效,是否可以共享一個InputStream
public boolean inPreferQualityOverSpeed //為true則優先保證Bitmap質量其次是解碼速度
public boolean inMutable //配置Bitmap是否可以更改,比如:在Bitmap上隔幾個像素加一條線段
public int inScreenDensity //當前屏幕的像素密度
工廠方法:
public static Bitmap decodeFile(String pathName, Options opts) //從文件讀取圖片
public static Bitmap decodeFile(String pathName)
public static Bitmap decodeStream(InputStream is) //從輸入流讀取圖片
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts)
public static Bitmap decodeResource(Resources res, int id) //從資源文件讀取圖片
public static Bitmap decodeResource(Resources res, int id, Options opts)
public static Bitmap decodeByteArray(byte[] data, int offset, int length) //從數組讀取圖片
public static Bitmap decodeByteArray(byte[] data, int offset, int length, Options opts)
public static Bitmap decodeFileDescriptor(FileDescriptor fd)//從文件讀取文件 與decodeFile不同的是這個直接調用JNI函數進行讀取 效率比較高
public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts)
Bitmap.Config inPreferredConfig :
枚舉變數 (點陣圖位數越高代表其可以存儲的顏色信息越多,圖像越逼真,佔用內存越大)
public static final Bitmap.Config ALPHA_8 //代表8位Alpha點陣圖 每個像素佔用1byte內存
public static final Bitmap.Config ARGB_4444 //代表16位ARGB點陣圖 每個像素佔用2byte內存
public static final Bitmap.Config ARGB_8888 //代表32位ARGB點陣圖 每個像素佔用4byte內存
public static final Bitmap.Config RGB_565 //代表8位RGB點陣圖 每個像素佔用2byte內存
Android中一張圖片(BitMap)佔用的內存主要和以下幾個因數有關:圖片長度,圖片寬度,單位像素佔用的位元組數。一張圖片(BitMap)佔用的內存=圖片長度*圖片寬度*單位像素佔用的位元組數