国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Bitmap圖像處理詳細教程

2020-02-21 17:38:09
字體:
來源:轉載
供稿:網友

  Bitmap是Android系統中很重要的圖像處理文件,今天小編給大家分享一篇關于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

  roundedSize = 1;

  while (roundedSize

  roundedSize

  }

  } 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

  // 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;

  }

  }

  以上就是關于Android Bitmap圖像處理的詳細教程,大家可以慢慢學習一下哦,更多相關內容請繼續關注武林技術頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铜山县| 始兴县| 六安市| 卢湾区| 马龙县| 临夏县| 泸水县| 桂平市| 确山县| 靖州| 望江县| 嘉定区| 大悟县| 贺兰县| 越西县| 文水县| 新宁县| 阿图什市| 阿克陶县| 钟祥市| 涡阳县| 巴南区| 化德县| 禹州市| 新绛县| 新化县| 渝北区| 衡南县| 白河县| 哈密市| 库尔勒市| 察隅县| 腾冲县| 凤翔县| 威远县| 凤城市| 万宁市| 巴林左旗| 南召县| 大新县| 贵阳市|