Android中Bitmap的常見操作(二.代碼)

來源:互聯網
上載者:User
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;@Overridepublic 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轉換為DrawableDrawable 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卡圖片的縮圖方法1String SDCarePath1=Environment.getExternalStorageDirectory().toString();String filePath1=SDCarePath1+"/"+"haha.jpg";Bitmap bitmapThumbnail1=this.getBitmapThumbnail(filePath1);imageView.setImageBitmap(bitmapThumbnail1);//————>以上為擷取SD卡圖片的縮圖方法1//————>以下為擷取SD卡圖片的縮圖方法2String 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;}//壓縮且儲存圖片到SDCardprivate 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為nullBitmap rawBitmap = BitmapFactory.decodeFile(filePath, options);if (rawBitmap==null) {System.out.println("此時rawBitmap為null");}//inSampleSize表示縮圖大小為原始圖片大小的幾分之一,若該值為3//則取出的縮圖的寬和高都是原始圖片的1/3,圖片大小就為原始大小的1/9//計算sampleSizeint sampleSize=computeSampleSize(options, 150, 200*200);//為了讀到圖片,必須把options.inJustDecodeBounds設回falseoptions.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;    }}

 

PS:

在"將圖片高寬和的大小kB壓縮"的例子中有幾處高寬的參數設定顛倒了或者不正確.需要修正,如下幾處

matrix.postScale(heightScale, widthScale);

Bitmap newBitmap = Bitmap.createBitmap(rawBitmap, 0, 0, rawWidth,rawWidth, matrix, true);

2013年1月30日15:36:20

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.