亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Android Bitmap詳細介紹

2024-04-29 21:01:06
字體:
來源:轉載
供稿:網友
Android中Bitmap的常見操作整理一覽,需要的朋友可以參考下
 
 
復制代碼代碼如下:

package com.testbitmapscale; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Iterator; 
import com.testbitmapscale.R.drawable; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.graphics.Rect; 
import android.graphics.RectF; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.media.ThumbnailUtils; 
import android.os.Bundle; 
import android.os.Environment; 
import android.view.View; 
import android.widget.ImageView; 
//方法: 
//1 生成圓角Bitmap圖片 
//2 生成Bitmap縮量圖 
//3 壓縮圖片場長寬以及kB 
//注意: 
//以上代碼,測試其中一個方法時最好注釋掉其余的代碼 
public class MainActivity extends Activity { 
private ImageView imageView; 
private Bitmap copyRawBitmap1; 
private Bitmap copyRawBitmap2; 
private Bitmap copyRawBitmap3; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 
imageView = (ImageView) findViewById(R.id.imageView); 
//第一種方式:從資源文件中得到圖片 
Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha); 
copyRawBitmap1=rawBitmap; 
copyRawBitmap2=rawBitmap; 
copyRawBitmap3=rawBitmap; 
//第二種方式:從SD卡中得到圖片(方法1) 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+"/"+"haha.jpg"; 
Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); 
//第二種方式:從SD卡中得到圖片(方法2) 
InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); 
Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream); 

//————>以下為將設置圖片的圓角 
Bitmap roundCornerBitmap=this.toRoundCorner(rawBitmap, 40); 
imageView.setImageBitmap(roundCornerBitmap); 
//————>以上為將設置圖片的圓角 

//————>以下為將圖片高寬和的大小kB壓縮 
// 得到圖片原始的高寬 
int rawHeight = rawBitmap.getHeight(); 
int rawWidth = rawBitmap.getWidth(); 
// 設定圖片新的高寬 
int newHeight = 500; 
int newWidth = 500; 
// 計算縮放因子 
float heightScale = ((float) newHeight) / rawHeight; 
float widthScale = ((float) newWidth) / rawWidth; 
// 新建立矩陣 
Matrix matrix = new Matrix(); 
matrix.postScale(heightScale, widthScale); 
// 設置圖片的旋轉角度 
//matrix.postRotate(-30); 
// 設置圖片的傾斜 
//matrix.postSkew(0.1f, 0.1f); 
//將圖片大小壓縮 
//壓縮后圖片的寬和高以及kB大小均會變化 
Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,rawWidth, matrix, true); 
// 將Bitmap轉換為Drawable 
Drawable newBitmapDrawable = new BitmapDrawable(newBitmap); 
imageView.setImageDrawable(newBitmapDrawable); 
//然后將Bitmap保存到SDCard中,方便于原圖片的比較 
this.compressAndSaveBitmapToSDCard(newBitmap, "xx100.jpg", 80); 
//問題: 
//原圖大小為625x690 90.2kB 
//如果設置圖片500x500 壓縮后大小為171kB.即壓縮后kB反而變大了. 
//原因是將:compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
//第二個參數quality設置得有些大了(比如100). 
//常用的是80,剛設100太大了造成的. 
//————>以上為將圖片高寬和的大小kB壓縮 


//————>以下為將圖片的kB壓縮,寬高不變 
this.compressAndSaveBitmapToSDCard(copyRawBitmap1,"0011fa.jpg",80); 
//————>以上為將圖片的kB壓縮,寬高不變 

//————>以下為獲取SD卡圖片的縮略圖方法1 
String SDCarePath1=Environment.getExternalStorageDirectory().toString(); 
String filePath1=SDCarePath1+"/"+"haha.jpg"; 
Bitmap bitmapThumbnail1=this.getBitmapThumbnail(filePath1); 
imageView.setImageBitmap(bitmapThumbnail1); 
//————>以上為獲取SD卡圖片的縮略圖方法1 

//————>以下為獲取SD卡圖片的縮略圖方法2 
String SDCarePath2=Environment.getExternalStorageDirectory().toString(); 
String filePath2=SDCarePath2+"/"+"haha.jpg"; 
Bitmap tempBitmap=BitmapFactory.decodeFile(filePath2); 
Bitmap bitmapThumbnail2=ThumbnailUtils.extractThumbnail(tempBitmap, 100, 100); 
imageView.setImageBitmap(bitmapThumbnail2); 
//————>以上為獲取SD卡圖片的縮略圖方法2 


//讀取SD卡下的圖片 
private InputStream getBitmapInputStreamFromSDCard(String fileName){ 
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
String filePath=SDCarePath+File.separator+fileName; 
File file=new File(filePath); 
try { 
FileInputStream fileInputStream=new FileInputStream(file); 
return fileInputStream; 
} catch (Exception e) { 
e.printStackTrace(); 



return null; 



//獲取SDCard的目錄路徑功能 
private String getSDCardPath() { 
String SDCardPath = null; 
// 判斷SDCard是否存在 
boolean IsSDcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
if (IsSDcardExist) { 
SDCardPath = Environment.getExternalStorageDirectory().toString(); 

return SDCardPath; 

//壓縮且保存圖片到SDCard 
private void compressAndSaveBitmapToSDCard(Bitmap rawBitmap,String fileName,int quality){ 
String saveFilePaht=this.getSDCardPath()+File.separator+fileName; 
File saveFile=new File(saveFilePaht); 
if (!saveFile.exists()) { 
try { 
saveFile.createNewFile(); 
FileOutputStream fileOutputStream=new FileOutputStream(saveFile); 
if (fileOutputStream!=null) { 
//imageBitmap.compress(format, quality, stream); 
//把位圖的壓縮信息寫入到一個指定的輸出流中 
//第一個參數format為壓縮的格式 
//第二個參數quality為圖像壓縮比的值,0-100.0 意味著小尺寸壓縮,100意味著高質量壓縮 
//第三個參數stream為輸出流 
rawBitmap.compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 

fileOutputStream.flush(); 
fileOutputStream.close(); 
} catch (IOException e) { 
e.printStackTrace(); 





//獲取圖片的縮略圖 
private Bitmap getBitmapThumbnail(String filePath){ 
BitmapFactory.Options options=new BitmapFactory.Options(); 
//true那么將不返回實際的bitmap對象,不給其分配內存空間但是可以得到一些解碼邊界信息即圖片大小等信息 
options.inJustDecodeBounds=true; 
//此時rawBitmap為null 
Bitmap rawBitmap = BitmapFactory.decodeFile(filePath, options); 
if (rawBitmap==null) { 
System.out.println("此時rawBitmap為null"); 

//inSampleSize表示縮略圖大小為原始圖片大小的幾分之一,若該值為3 
//則取出的縮略圖的寬和高都是原始圖片的1/3,圖片大小就為原始大小的1/9 
//計算sampleSize 
int sampleSize=computeSampleSize(options, 150, 200*200); 
//為了讀到圖片,必須把options.inJustDecodeBounds設回false 
options.inJustDecodeBounds = false; 
options.inSampleSize = sampleSize; 
//原圖大小為625x690 90.2kB 
//測試調用computeSampleSize(options, 100, 200*100); 
//得到sampleSize=8 
//得到寬和高位79和87 
//79*8=632 87*8=696 
Bitmap thumbnailBitmap=BitmapFactory.decodeFile(filePath, options); 
//保存到SD卡方便比較 
this.compressAndSaveBitmapToSDCard(thumbnailBitmap, "15.jpg", 80); 
return thumbnailBitmap; 


//參考資料: 
//http://my.csdn.net/zljk000/code/detail/18212 
//第一個參數:原本Bitmap的options 
//第二個參數:希望生成的縮略圖的寬高中的較小的值 
//第三個參數:希望生成的縮量圖的總像素 
public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels); 
int roundedSize; 
if (initialSize <= 8) { 
roundedSize = 1; 
while (roundedSize < initialSize) { 
roundedSize <<= 1; 

} else { 
roundedSize = (initialSize + 7) / 8 * 8; 

return roundedSize; 


private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
//原始圖片的寬 
double w = options.outWidth; 
//原始圖片的高 
double h = options.outHeight; 
System.out.println("========== w="+w+",h="+h); 
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math 
.sqrt(w * h / maxNumOfPixels)); 
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( 
Math.floor(w / minSideLength), Math.floor(h / minSideLength)); 
if (upperBound < lowerBound) { 
// return the larger one when there is no overlapping zone. 
return lowerBound; 

if ((maxNumOfPixels == -1) && (minSideLength == -1)) { 
return 1; 
} else if (minSideLength == -1) { 
return lowerBound; 
} else { 
return upperBound; 



/** 
* @param bitmap 需要修改的圖片 
* @param pixels 圓角的弧度 
* @return 圓角圖片 
*/ 
//參考資料: 
//http://blog.csdn.net/c8822882/article/details/6906768 
public Bitmap toRoundCorner(Bitmap bitmap, int pixels) { 
Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
Canvas canvas = new Canvas(roundCornerBitmap); 
int color = 0xff424242;//int color = 0xff424242; 
Paint paint = new Paint(); 
paint.setColor(color); 
//防止鋸齒 
paint.setAntiAlias(true); 
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
RectF rectF = new RectF(rect); 
float roundPx = pixels; 
//相當于清屏 
canvas.drawARGB(0, 0, 0, 0); 
//先畫了一個帶圓角的矩形 
canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
//再把原來的bitmap畫到現在的bitmap?。?!注意這個理解 
canvas.drawBitmap(bitmap, rect, rect, paint); 
return roundCornerBitmap; 



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2018国产精品视频| 97在线视频免费播放| 亚洲字幕一区二区| 精品久久国产精品| 国产成人精品999| 久久影视电视剧免费网站清宫辞电视| 亚洲欧美自拍一区| 亚洲男子天堂网| 国产精品永久免费观看| 亚洲护士老师的毛茸茸最新章节| 91国内揄拍国内精品对白| 国产日韩视频在线观看| 亚洲电影第1页| 欧美日韩另类字幕中文| 日韩在线小视频| 亚洲欧美激情四射在线日| 国产精品海角社区在线观看| 国产欧美日韩精品在线观看| 精品一区二区三区电影| 亚洲综合视频1区| 欧美丰满老妇厨房牲生活| 91sao在线观看国产| 亚洲国产精品悠悠久久琪琪| 亚洲国模精品一区| 国产精品一区二区三区毛片淫片| 亚洲人成网站777色婷婷| 欧美日韩激情视频8区| 久久九九国产精品怡红院| 91人人爽人人爽人人精88v| 国产精品久久一区| 欧美专区第一页| 精品久久久久久久久久ntr影视| 欧美在线视频免费| 日本国产精品视频| 欧美大尺度激情区在线播放| 日韩高清免费观看| 精品国产鲁一鲁一区二区张丽| 国产视频精品va久久久久久| 成人免费看黄网站| 亚洲天堂av网| 亚洲欧美日韩视频一区| 欧美麻豆久久久久久中文| 热门国产精品亚洲第一区在线| 热99精品只有里视频精品| 日日摸夜夜添一区| 亚洲精品视频网上网址在线观看| 国产91在线高潮白浆在线观看| 69久久夜色精品国产69乱青草| 国产欧洲精品视频| 亚洲综合在线小说| 亚洲精品第一国产综合精品| 国产在线精品一区免费香蕉| www.亚洲一二| 在线观看不卡av| 欧美另类老女人| 国产视频亚洲精品| 亚洲欧洲午夜一线一品| 美女999久久久精品视频| 国产脚交av在线一区二区| 亚洲最大福利视频网站| 97碰碰碰免费色视频| www.亚洲男人天堂| 日韩中文字幕在线免费观看| 亚洲国产成人精品久久久国产成人一区| 精品调教chinesegay| 8x海外华人永久免费日韩内陆视频| 91精品视频在线免费观看| 日韩精品中文字| 日本sm极度另类视频| 国产精品久久久久久久久久免费| 中文字幕日韩电影| 欧美黑人xxx| 欧美亚洲一区在线| 亚洲视频欧美视频| 精品久久久久久电影| 成人精品一区二区三区电影黑人| 国产精品视频地址| 欧美成人高清视频| 日韩电影免费观看中文字幕| 精品视频在线观看日韩| 成人精品视频久久久久| 欧日韩在线观看| 日韩美女在线观看| 欧美精品在线第一页| 欧美重口另类videos人妖| 91在线观看免费网站| 精品国产依人香蕉在线精品| 91在线免费网站| 欧美日韩成人精品| 色樱桃影院亚洲精品影院| 亚洲欧美成人一区二区在线电影| 日韩黄色av网站| 欧美激情一区二区三级高清视频| 日本aⅴ大伊香蕉精品视频| 青青精品视频播放| 日韩中文有码在线视频| 2019中文字幕在线| 热99久久精品| 国产成人激情视频| 久久精品国产2020观看福利| 51视频国产精品一区二区| 亚洲成年网站在线观看| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美日韩国产中文专区| 日韩av一区二区在线观看| 欧美电影在线播放| 色777狠狠综合秋免鲁丝| 欧美性xxxxx| 国内精品久久久久久| 欧美成人免费视频| 国内精品久久久久久久久| 最好看的2019年中文视频| 日本精品视频在线观看| 国产精品第三页| 亚洲欧美日韩中文在线制服| 色妞色视频一区二区三区四区| 中文字幕久热精品视频在线| 热久久99这里有精品| 欧美高清视频在线播放| 九九热精品在线| 91精品久久久久久久久久久久久久| www高清在线视频日韩欧美| 91免费人成网站在线观看18| 欧美精品在线极品| 亚洲电影成人av99爱色| 欧美一级淫片videoshd| 色综合视频网站| 欧美日韩一区二区免费在线观看| 亚洲最新av在线网站| 欧美激情一区二区三区久久久| 激情成人中文字幕| 国产精品日韩欧美综合| 91亚洲一区精品| 亚洲国产免费av| 久久久久久国产三级电影| 91成人免费观看网站| 91深夜福利视频| 美日韩精品免费视频| 97精品免费视频| 欧美精品激情在线观看| 日韩欧美中文免费| 91免费欧美精品| 日韩中文在线中文网三级| 国产日韩欧美中文在线播放| 一本一本久久a久久精品牛牛影视| 精品中文字幕视频| 国产精品久久久久久久久久99| 欧美激情xxxx性bbbb| 亚洲图中文字幕| 97免费视频在线播放| 午夜精品久久久久久久久久久久| 精品欧美国产一区二区三区| 亚洲国产日韩欧美综合久久| 热久久99这里有精品| 一本色道久久综合狠狠躁篇怎么玩| 一区二区三区视频观看| 97国产精品视频人人做人人爱| 亚洲欧美综合另类中字| 91精品久久久久久久久久另类| 97色在线视频观看| 日本不卡高字幕在线2019| 亚洲成年人在线播放| 国产亚洲精品久久久优势| 中文字幕精品一区久久久久|