1. 程式人生 > >Android呼叫相機拍照,壓縮圖片後儲存SD卡中

Android呼叫相機拍照,壓縮圖片後儲存SD卡中

最近在搞一個專案,需求是呼叫系統相機拍完照片後儲存本地,再上傳至後臺伺服器,但為了節省流量需要壓縮上傳,將圖片壓縮至100K以內。這個是在特定機器上執行,類似於手持POS機,但是它的相機幾乎沒有優化,對焦慢,而且拍照也不清晰,使用自己的手機呼叫系統相機拍照後圖片大概有300K左右,自動已經壓縮了,但這個機器沒有優化,呼叫相機拍照後的圖片和原圖一樣2M左右,太大了,必須要壓縮!
網上找了些資料,也作為參考:Android圖片壓縮 質量壓縮和尺寸壓縮安卓相機拍攝照片,壓縮後儲存於SD卡
專案需要的效果為:

上程式碼:

import java.io.BufferedOutputStream;
import
java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import
android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity implements
OnClickListener{
private Button openCamera,openCamera2; private ImageView showImgView; Uri photoUri; String filePath; //圖片路徑 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); } private void findView() { // TODO Auto-generated method stub openCamera = (Button) findViewById(R.id.openCamera); openCamera2 = (Button) findViewById(R.id.openCamera2); showImgView = (ImageView) findViewById(R.id.showImgView); openCamera.setOnClickListener(this); openCamera2.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()){ case R.id.openCamera: //打卡相機前先檢測SD卡是否可以用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ photoUri = patrUri("file1"); startCamera(1001,photoUri); }else{ Toast.makeText(MainActivity.this, "SD卡不可用", Toast.LENGTH_SHORT).show(); } break; case R.id.openCamera2: if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ photoUri = patrUri("file2"); startCamera(1002,photoUri); }else{ Toast.makeText(MainActivity.this, "SD卡不可用", Toast.LENGTH_SHORT).show(); } break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if(requestCode == 1001){ if(resultCode == RESULT_OK){ FileInputStream is = null; try { is = new FileInputStream(filePath); Bitmap bitmap = BitmapFactory.decodeStream(is); showImgView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } if(requestCode == 1002){ if(resultCode == RESULT_OK){ try { Bitmap bitmap = compressBySize(filePath,480,800); //設定壓縮後圖片的高度和寬度 saveFile(bitmap,filePath); showImgView.setImageBitmap(bitmap); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } // 壓縮圖片尺寸 private static Bitmap compressBySize(String pathName, int targetWidth, int targetHeight) { BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inJustDecodeBounds = true;// 不去真的解析圖片,只是獲取圖片的頭部資訊,包含寬高等; Bitmap bitmap = BitmapFactory.decodeFile(pathName, opts); // 得到圖片的寬度、高度; float imgWidth = opts.outWidth; float imgHeight = opts.outHeight; // 分別計算圖片寬度、高度與目標寬度、高度的比例;取大於等於該比例的最小整數; int widthRatio = (int) Math.ceil(imgWidth / (float) targetWidth); int heightRatio = (int) Math.ceil(imgHeight / (float) targetHeight); opts.inSampleSize = 1; if (widthRatio > 1 || widthRatio > 1) { if (widthRatio > heightRatio) { opts.inSampleSize = widthRatio; } else { opts.inSampleSize = heightRatio; } } // 設定好縮放比例後,載入圖片進內容; opts.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeFile(pathName, opts); return bitmap; } //儲存壓縮後的圖片 private void saveFile(Bitmap bitmap, String filePath2) throws IOException { // TODO Auto-generated method stub File testFile = new File(filePath2); if (testFile.exists()) { testFile.delete(); } File myCaptureFile = new File(filePath2); System.out.println("------filePath2==" + filePath2); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(myCaptureFile)); // 100表示不進行壓縮,70表示壓縮率為30% bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bos); bos.flush(); bos.close(); } //開啟相機 private void startCamera(int requestCode, Uri photoUri) { // TODO Auto-generated method stub Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri); startActivityForResult(intent, requestCode); } /** * 圖片儲存路徑 這裡是在SD卡目錄下建立了MyPhoto資料夾 * @param fileName * @return */ private Uri patrUri(String fileName) { //指定了圖片的名字,可以使用時間來命名 // TODO Auto-generated method stub String strPhotoName = fileName+".jpg"; String savePath = Environment.getExternalStorageDirectory().getPath() + "/MyPhoto/"; File dir = new File(savePath); if (!dir.exists()) { dir.mkdirs(); } filePath = savePath + strPhotoName; return Uri.fromFile(new File(dir, strPhotoName)); } }

頁面佈局很簡單,就兩個Button跟一個ImageView,這裡就不貼程式碼了。
效果圖片:
這裡寫圖片描述
SD卡中的圖片:
這裡寫圖片描述
可以看到,file2.jpg是壓縮過的,file1.jpg是原圖,因為是模擬器,效果不太明顯,在真機上壓縮後的圖片在100K之內。

要呼叫相機和讀寫SD卡,最後不要忘了加許可權。

程式碼下載
因為工作的原因,這裡使用的是Myeclipse不過Eclipse也可以用。

相關推薦

Android呼叫相機拍照壓縮圖片儲存SD

最近在搞一個專案,需求是呼叫系統相機拍完照片後儲存本地,再上傳至後臺伺服器,但為了節省流量需要壓縮上傳,將圖片壓縮至100K以內。這個是在特定機器上執行,類似於手持POS機,但是它的相機幾乎沒有優化,對焦慢,而且拍照也不清晰,使用自己的手機呼叫系統相機拍照後圖片

關於Android呼叫相機拍照完成無法返回

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String path = Environment.getExternalStorageDirectory().getAbsolutePath()

Android呼叫相機拍照壓縮圖片

1、直接onActivityResult裡 ,從Intent data引數中可以取出拍照後縮圖,基本不需要壓縮的。 2、是設定儲存路徑,然後拍完之後直接讀取該路徑的圖片: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Str

Android呼叫相機拍照圖片橫向顯示的問題解決

最近在做一個專案的時候出現需要實時拍照然後作為頭像上傳伺服器的一個操作,按照以前的老專案老是出現拍照後對 圖片處理的問題上圖片橫向顯示,這樣切割出來的圖片也就是橫向了,找了很久才解決出來問題的根源,現在記錄下來, 以後遇到這個問題就不會出錯了。 1:一般相機拍完照後正常顯示在螢幕上如圖,

android呼叫相機拍照返回的照片大小太小變得模糊

1、使用相機拍照預設情況下呼叫相機的方式: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAMERA_REQUEST_CODE);//CAMERA_REQ

Andrid 呼叫相機拍照相簿圖片裁剪

Andrid 呼叫相機拍照,相簿,圖片裁剪   新增讀寫許可權 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission a

呼叫android系統相機拍照並將圖片傳指定路徑並獲取相片

public void onClick(View v) { if (v.getId() == R.id.btn_take) { // 調系統相機 if (Environment.getExterna

關於android呼叫系統拍照返回圖片是旋轉90度..

由於專案的需要,沒有自定義拍照功能,僅僅呼叫了系統的拍照程式..但是出現了一個問題,就是拍照完成顯示圖片居然是被旋轉的圖片....解決辦法:/** * 獲取圖片的旋轉角度,有些系統把拍照的圖片旋轉了,有的沒有旋轉 */ int degree

解決Android 呼叫相機拍照得到的照片不清晰問題

最近在做一個需要上傳拍照的APP,上傳的時候因為是小圖片,但是需求提了要點選可預覽大圖,一看大圖,被嚇到了,根本看不清楚,大圖中的具體內容。原因是通過MediaStore.ACTION_IMAGE_CAPTURE方式直接去呼叫相機,在onactivityr

MVP模式的Android 呼叫系統拍照相簿剪裁適配到7.0,修復拍照圖片旋轉問題

Android 呼叫系統拍照,相簿,剪裁,適配到7.0,修復拍照圖片旋轉問題 直接上程式碼 首先新增拍照需要的許可權 <uses-permission android:name="android.permission.CAMERA" />//相

上傳頭像 呼叫相機拍照 及簡單的呼叫相簿的照片來上傳頭像

首先我在對應的主頁面 xml裡面進行一個相關的UI介面的佈局 對應的兩個Button按鈕 一個拍照,一個呼叫相簿 一個Imageview 的一張小機器人的圖片 <?xml version="1.0" encoding="utf-8"?> <LinearLa

Android呼叫相機拍照並新增水印

最近專案提出新需求,要求在拍照後在圖片上新增使用者資訊的水印,so,樓主重新整理封裝了一個簡單的拍照+水印的工具類,需求不同,僅供參考。檔案操作及許可權做了適配,支援androidN及以上版本,放心使用。 效果演示: 如何呼叫相機這裡就不介紹了,因為小夥伴們基本都使用過

Android--呼叫相機拍照(支援到8.0)

import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.o

呼叫Android系統自帶相機拍照從相簿獲取圖片(相容7.0系統)

一,前言: 在日常的手機應用開發過程中,經常會遇到上傳圖片的需求,像上傳頭像之類的,這就需要呼叫系統的相機,相簿獲取照片。但是在Android 系統7.0之後認為這種操作是不安全的,這篇文章主要就是記錄7.0獲取照片遇到的問題。 二,FileProvider介紹 都

Android呼叫相機實現拍照並裁剪圖片呼叫手機的相簿圖片並裁剪圖片

在 Android應用中,很多時候我們需要實現上傳圖片,或者直接呼叫手機上的拍照功能拍照處理然後直接顯示並上傳功能,下面將講述呼叫相機拍照處理圖片然後顯示和呼叫手機相簿中的圖片處理然後顯示的功能,要想實現上傳功能,一般都是上傳到資料庫中,將imageView中的圖片取出來然

Android開發之呼叫相機拍照與本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可

android 呼叫系統相機拍照返回的data為null

最近做專案,需要拍照功能,於是就想簡單的呼叫系統相機來完成這一需求(當然,如果想要個性化一點的,也可以自定義camera去實現,這裡暫時不做)。 if(Environment.getExternalStorageState().equals(Environ

android呼叫相機自動拍照

  b 合理使用requestAnimationFrame動畫代替setTimeout 微服務 基於Mongodb分散式集做資料分析時,當前命令 IBM DB2 .比如路由器即不能有這種情況出現,贏得了各大平臺的青睞ANSWER是資源呈現出來的形式.   如果1眼看到全

Android demo--呼叫系統相機拍照並顯示圖片為黑白

1.環境搭建 作業系統是Mac OS,一年多以前寫Android的時候用的還是Eclipse,作業系統是Windows,記得環境很難搭建,總是會有錯誤,所以面試的時候要求完成這個Demo還是有一點點虛。不過用Baidu和Google查了怎麼搭建環境之後,發現有了官方的IDE

Android呼叫系統相機拍照從相簿選擇照片呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了: Error type 3 Error: Activity class {com.example.myapplication/com.example.myapplication