android Bitmap類方法屬性 詳細說明

android Bitmap類方法屬性 詳細說明

(轉:http://blog.csdn.net/ymangu666/article/details/37729109)

1.  BitMap類
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爲原圖,創建新的圖片,指定起始座標以及新圖像的高寬。 
2. BitmapFactory工廠類:
Option 參數類: 
public boolean inJustDecodeBounds——如果設置爲true,不獲取圖片,不分配內存,但會返回圖片的高度寬度信息。 
public int inSampleSize——圖片縮放的倍數。如果設爲4,則寬和高都爲原來的1/4,則圖是原來的1/16。 
public int outWidth——獲取圖片的寬度值 
public int outHeight——獲取圖片的高度值 
public int inDensity——用於位圖的像素壓縮比 
public int inTargetDensity——用於目標位圖的像素壓縮比(要生成的位圖) 
public boolean inScaled——設置爲true時進行圖片壓縮,從inDensity到inTargetDensity。

使用BitmapFactory  可從資源files, streams, and byte-arrays中解碼生成Bitmap對象。
讀取一個文件路徑得到一個位圖。如果指定文件爲空或者不能解碼成文件,則返回NULL。 
public static Bitmap decodeFile(String pathName, Options opts) 
public static Bitmap decodeFile(String pathName) 
讀取一個資源文件得到一個位圖。如果位圖數據不能被解碼,或者opts參數只請求大小信息時,則返回NuLL。 
(即當Options.inJustDecodeBounds=true,只請求圖片的大小信息。) 
public static Bitmap decodeResource(Resources res, int id) 
public static Bitmap decodeResource(Resources res, int id, Options opts) 
從輸入流中解碼位圖 
public static Bitmap decodeStream(InputStream is) 
從字節數組中解碼生成不可變的位圖 
public static Bitmap decodeByteArray(byte[] data, int offset, int length) 

BitmapDrawable類:繼承於Drawable,你可以從文件路徑、輸入流、XML文件以及Bitmap中創建。 
常用的構造函數: 
Resources res=getResources();//獲取資源 
public BitmapDrawable(Resources res)——創建一個空的drawable。(Response用來指定初始時所用的像素密度)替代public BitmapDrawable()方法(此方法不處理像素密度) 
public BitmapDrawable(Resources res, Bitmap bitmap)——Create drawable from a bitmap 
public BitmapDrawable(Resources res, String filepath)——Create a drawable by opening a given file path and decoding the bitmap. 
public BitmapDrawable(Resources res, java.io.InputStream is)——Create a drawable by decoding a bitmap from the given input stream. 

2).顯示Bitmap
2.1) 使用Canvas類顯示位圖

複製代碼

 1 public class Main extends Activity {        
 2     @Override  
 3     public void onCreate(Bundle savedInstanceState) {   
 4         super.onCreate(savedInstanceState);   
 5         setContentView(new Panel(this));   
 6     }          
 7     class Panel extends View{            
 8         public Panel(Context context) {     
 9             super(context);    
10         }         
11         public void onDraw(Canvas canvas){     
12             Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180);     
13             canvas.drawColor(Color.BLACK);     
14             canvas.drawBitmap(bmp, 10, 10, null);     
15         }     
16     }    
17 }

複製代碼

2.2) 通過BitmapDrawable顯示位圖

複製代碼

1 // 獲取位圖 2  Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180); 
3  // 轉換爲BitmapDrawable對象 4  BitmapDrawable bmpDraw=new BitmapDrawable(bmp); 
5  // 顯示位圖 6  ImageView iv2 = (ImageView)findViewById(R.id.ImageView02); 
7  iv2.setImageDrawable(bmpDraw);

複製代碼

Android中Bitmap的常見操作整理一覽,需要的朋友可以參考下

摘自:http://www.jb51.net/article/32366.htm

複製代碼

  1 //方法: 
  2 //1 生成圓角Bitmap圖片 
  3 //2 生成Bitmap縮量圖 
  4 //3 壓縮圖片場長寬以及kB 
  5 //注意: 
  6 //以上代碼,測試其中一個方法時最好註釋掉其餘的代碼   7 public class MainActivity extends Activity { 
  8 private ImageView imageView; 
  9 private Bitmap copyRawBitmap1; 
 10 private Bitmap copyRawBitmap2; 
 11 private Bitmap copyRawBitmap3; 
 12 @Override 
 13 public void onCreate(Bundle savedInstanceState) { 
 14 super.onCreate(savedInstanceState); 
 15 setContentView(R.layout.main); 
 16 imageView = (ImageView) findViewById(R.id.imageView); 
 17 //第一種方式:從資源文件中得到圖片  18 Bitmap rawBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.haha); 
 19 copyRawBitmap1=rawBitmap; 
 20 copyRawBitmap2=rawBitmap; 
 21 copyRawBitmap3=rawBitmap; 
 22 //第二種方式:從SD卡中得到圖片(方法1)  23 String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
 24 String filePath=SDCarePath+"/"+"haha.jpg"; 
 25 Bitmap rawBitmap1 = BitmapFactory.decodeFile(filePath, null); 
 26 //第二種方式:從SD卡中得到圖片(方法2)  27 InputStream inputStream=getBitmapInputStreamFromSDCard("haha.jpg"); 
 28 Bitmap rawBitmap2 = BitmapFactory.decodeStream(inputStream); 
 29  30 //————>以下爲將設置圖片的圓角  31 Bitmap roundCornerBitmap=this.toRoundCorner(rawBitmap, 40); 
 32 imageView.setImageBitmap(roundCornerBitmap); 
 33 //————>以上爲將設置圖片的圓角 
 34  35 //————>以下爲將圖片高寬和的大小kB壓縮 
 36 // 得到圖片原始的高寬  37 int rawHeight = rawBitmap.getHeight(); 
 38 int rawWidth = rawBitmap.getWidth(); 
 39 // 設定圖片新的高寬  40 int newHeight = 500; 
 41 int newWidth = 500; 
 42 // 計算縮放因子  43 float heightScale = ((float) newHeight) / rawHeight; 
 44 float widthScale = ((float) newWidth) / rawWidth; 
 45 // 新建立矩陣  46 Matrix matrix = new Matrix(); 
 47 matrix.postScale(heightScale, widthScale); 
 48 // 設置圖片的旋轉角度 
 49 //matrix.postRotate(-30); 
 50 // 設置圖片的傾斜 
 51 //matrix.postSkew(0.1f, 0.1f); 
 52 //將圖片大小壓縮 
 53 //壓縮後圖片的寬和高以及kB大小均會變化  54 Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,rawWidth, matrix, true); 
 55 // 將Bitmap轉換爲Drawable  56 Drawable newBitmapDrawable = new BitmapDrawable(newBitmap); 
 57 imageView.setImageDrawable(newBitmapDrawable); 
 58 //然後將Bitmap保存到SDCard中,方便於原圖片的比較  59 this.compressAndSaveBitmapToSDCard(newBitmap, "xx100.jpg", 80); 
 60 //問題: 
 61 //原圖大小爲625x690 90.2kB 
 62 //如果設置圖片500x500 壓縮後大小爲171kB.即壓縮後kB反而變大了. 
 63 //原因是將:compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
 64 //第二個參數quality設置得有些大了(比如100). 
 65 //常用的是80,剛設100太大了造成的. 
 66 //————>以上爲將圖片高寬和的大小kB壓縮 
 67  68  69 //————>以下爲將圖片的kB壓縮,寬高不變  70 this.compressAndSaveBitmapToSDCard(copyRawBitmap1,"0011fa.jpg",80); 
 71 //————>以上爲將圖片的kB壓縮,寬高不變 
 72  73 //————>以下爲獲取SD卡圖片的縮略圖方法1  74 String SDCarePath1=Environment.getExternalStorageDirectory().toString(); 
 75 String filePath1=SDCarePath1+"/"+"haha.jpg"; 
 76 Bitmap bitmapThumbnail1=this.getBitmapThumbnail(filePath1); 
 77 imageView.setImageBitmap(bitmapThumbnail1); 
 78 //————>以上爲獲取SD卡圖片的縮略圖方法1 
 79  80 //————>以下爲獲取SD卡圖片的縮略圖方法2  81 String SDCarePath2=Environment.getExternalStorageDirectory().toString(); 
 82 String filePath2=SDCarePath2+"/"+"haha.jpg"; 
 83 Bitmap tempBitmap=BitmapFactory.decodeFile(filePath2); 
 84 Bitmap bitmapThumbnail2=ThumbnailUtils.extractThumbnail(tempBitmap, 100, 100); 
 85 imageView.setImageBitmap(bitmapThumbnail2); 
 86 //————>以上爲獲取SD卡圖片的縮略圖方法2  87  88 } 
 89 //讀取SD卡下的圖片  90 private InputStream getBitmapInputStreamFromSDCard(String fileName){ 
 91 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
 92 String SDCarePath=Environment.getExternalStorageDirectory().toString(); 
 93 String filePath=SDCarePath+File.separator+fileName; 
 94 File file=new File(filePath); 
 95 try { 
 96 FileInputStream fileInputStream=new FileInputStream(file); 
 97 return fileInputStream; 
 98 } catch (Exception e) { 
 99 e.printStackTrace(); 
100 } 
101 102 } 
103 return null; 
104 } 
105 106 107 //獲取SDCard的目錄路徑功能 108 private String getSDCardPath() { 
109 String SDCardPath = null; 
110 // 判斷SDCard是否存在 111 boolean IsSDcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 
112 if (IsSDcardExist) { 
113 SDCardPath = Environment.getExternalStorageDirectory().toString(); 
114 } 
115 return SDCardPath; 
116 } 
117 //壓縮且保存圖片到SDCard 118 private void compressAndSaveBitmapToSDCard(Bitmap rawBitmap,String fileName,int quality){ 
119 String saveFilePaht=this.getSDCardPath()+File.separator+fileName; 
120 File saveFile=new File(saveFilePaht); 
121 if (!saveFile.exists()) { 
122 try { 
123 saveFile.createNewFile(); 
124 FileOutputStream fileOutputStream=new FileOutputStream(saveFile); 
125 if (fileOutputStream!=null) { 
126 //imageBitmap.compress(format, quality, stream); 
127 //把位圖的壓縮信息寫入到一個指定的輸出流中 
128 //第一個參數format爲壓縮的格式 
129 //第二個參數quality爲圖像壓縮比的值,0-100.0 意味着小尺寸壓縮,100意味着高質量壓縮 
130 //第三個參數stream爲輸出流 131 rawBitmap.compress(Bitmap.CompressFormat.JPEG, quality, fileOutputStream); 
132 } 
133 fileOutputStream.flush(); 
134 fileOutputStream.close(); 
135 } catch (IOException e) { 
136 e.printStackTrace(); 
137 138 } 
139 } 
140 } 
141 142 //獲取圖片的縮略圖 143 private Bitmap getBitmapThumbnail(String filePath){ 
144 BitmapFactory.Options options=new BitmapFactory.Options(); 
145 //true那麼將不返回實際的bitmap對象,不給其分配內存空間但是可以得到一些解碼邊界信息即圖片大小等信息 146 options.inJustDecodeBounds=true; 
147 //此時rawBitmap爲null 148 Bitmap rawBitmap = BitmapFactory.decodeFile(filePath, options); 
149 if (rawBitmap==null) { 
150 System.out.println("此時rawBitmap爲null"); 
151 } 
152 //inSampleSize表示縮略圖大小爲原始圖片大小的幾分之一,若該值爲3 
153 //則取出的縮略圖的寬和高都是原始圖片的1/3,圖片大小就爲原始大小的1/9 
154 //計算sampleSize 155 int sampleSize=computeSampleSize(options, 150, 200*200); 
156 //爲了讀到圖片,必須把options.inJustDecodeBounds設回false 157 options.inJustDecodeBounds = false; 
158 options.inSampleSize = sampleSize; 
159 //原圖大小爲625x690 90.2kB 
160 //測試調用computeSampleSize(options, 100, 200*100); 
161 //得到sampleSize=8 
162 //得到寬和高位79和87 
163 //79*8=632 87*8=696 164 Bitmap thumbnailBitmap=BitmapFactory.decodeFile(filePath, options); 
165 //保存到SD卡方便比較 166 this.compressAndSaveBitmapToSDCard(thumbnailBitmap, "15.jpg", 80); 
167 return thumbnailBitmap; 
168 } 
169 170 //參考資料: 
171 //http://my.csdn.net/zljk000/code/detail/18212 172 //第一個參數:原本Bitmap的options 
173 //第二個參數:希望生成的縮略圖的寬高中的較小的值 
174 //第三個參數:希望生成的縮量圖的總像素 175 public static int computeSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
176 int initialSize = computeInitialSampleSize(options, minSideLength,maxNumOfPixels); 
177 int roundedSize; 
178 if (initialSize <= 8) { 
179 roundedSize = 1; 
180 while (roundedSize < initialSize) { 
181 roundedSize <<= 1; 
182 } 
183 } else { 
184 roundedSize = (initialSize + 7) / 8 * 8; 
185 } 
186 return roundedSize; 
187 } 
188 189 private static int computeInitialSampleSize(BitmapFactory.Options options,int minSideLength, int maxNumOfPixels) { 
190 //原始圖片的寬 191 double w = options.outWidth; 
192 //原始圖片的高 193 double h = options.outHeight; 
194 System.out.println("========== w="+w+",h="+h); 
195 int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math 
196 .sqrt(w * h / maxNumOfPixels)); 
197 int upperBound = (minSideLength == -1) ? 128 : (int) Math.min( 
198 Math.floor(w / minSideLength), Math.floor(h / minSideLength)); 
199 if (upperBound < lowerBound) { 
200 // return the larger one when there is no overlapping zone. 201 return lowerBound; 
202 } 
203 if ((maxNumOfPixels == -1) && (minSideLength == -1)) { 
204 return 1; 
205 } else if (minSideLength == -1) { 
206 return lowerBound; 
207 } else { 
208 return upperBound; 
209 } 
210 } 
211 212 /** 213 * @param bitmap 需要修改的圖片 
214 * @param pixels 圓角的弧度 
215 * @return 圓角圖片 
216 */ 217 //參考資料: 
218 //http://blog.csdn.net/c8822882/article/details/6906768 219 public Bitmap toRoundCorner(Bitmap bitmap, int pixels) { 
220 Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
221 Canvas canvas = new Canvas(roundCornerBitmap); 
222 int color = 0xff424242;//int color = 0xff424242; 223 Paint paint = new Paint(); 
224 paint.setColor(color); 
225 //防止鋸齒 226 paint.setAntiAlias(true); 
227 Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
228 RectF rectF = new RectF(rect); 
229 float roundPx = pixels; 
230 //相當於清屏 231 canvas.drawARGB(0, 0, 0, 0); 
232 //先畫了一個帶圓角的矩形 233 canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 
234 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
235 //再把原來的bitmap畫到現在的bitmap!!!注意這個理解 236 canvas.drawBitmap(bitmap, rect, rect, paint); 
237 return roundCornerBitmap; 
238 } 
239 240 }

複製代碼

原文:http://www.cnblogs.com/jenson138/p/4302073.html轉載請標明出處,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章