1. 程式人生 > >Android壓縮圖片並且儲存到本地記憶體卡中

Android壓縮圖片並且儲存到本地記憶體卡中

        親愛的同學們,相信我們在軟體開發中經常會遇到拍照,選擇相簿上傳的功能。前幾天遇到一個這樣的一個問題。後臺要求我上傳的圖片不能超過500KB,大家知道我們現在的智慧手機畫素越來越高,拍照的照片一般都是幾兆甚至一二十兆。那麼我們改怎麼做呢,答案是一定的,那就是先進行壓縮,然後在儲存壓縮後的圖片上傳。最近在網路上也搜尋到了很多關於壓縮的內容,相信大家會有和我同感,為什麼都寫的不清楚,或許我們可以實現我們的功能,但是這是如何實現的,為什麼呢。下面我就貼出我的程式碼,每一步驟都會有詳細的註釋。希望會幫到大家。

    第一,就是壓縮圖片的方法。在我們選擇照片或者拍照之後,將圖片路徑傳入進去就可以進行壓縮,然後返回我們一個Bitmap的物件。註釋的比較清楚,哪裡不明白的可以給我評論留言。

/**
     * @param path
     * @return
     * @throws IOException
     * 壓縮圖片
     */
    public static Bitmap revitionImageSize(String path) throws IOException {
        //根據檔案路徑,建立一個位元組緩衝輸入流
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(
                new File(path)));
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        //根據流返回一個位圖也就是bitmap,當options.inJustDecodeBounds = true的時候不需要完全解碼,
        // 它僅僅會把它的寬,高取回來給你,這樣就不會佔用太多的記憶體,也就不會那麼頻繁的發生OOM了
        BitmapFactory.decodeStream(in, null, options);
        //關閉流
        in.close();
        int i = 0;
        Bitmap bitmap = null;
        while (true) {
            // options.outWidth >> i 。右移運算子,num >> 1,相當於num除以2
            if ((options.outWidth >> i <= 1000) && (options.outHeight >> i <= 1000)) {
                //得到一個輸入流
                in = new BufferedInputStream(new FileInputStream(new File(path)));
                //為了解決圖片解碼時候出現SanpleSize錯誤,設定恰當的inSampleSize可以使BitmapFactory分配更少的空間以消除該錯誤
                //你將 inSampleSize 賦值為2,那就是每隔2行採1行,每隔2列採一列,那你解析出的圖片就是原圖大小的1/4.
                // Math.pow(2.0D, i)次方運算,2的i次方是多少
                options.inSampleSize = (int) Math.pow(2.0D, i);
                // 這裡之前設定為了true,所以要改為false,否則就建立不出圖片
                options.inJustDecodeBounds = false;
                bitmap = BitmapFactory.decodeStream(in, null, options);
                break;
            }
            i += 1;
        }
        return bitmap;
    }
第二、當我們拿到這個Bitmap物件之後,我們就可以進行儲存的操作,因為我們這個畢竟是個物件,我們通常的上傳過程是需要上傳的檔案的。
 /**
     * @param bitmap
     * 儲存圖片到SD卡的方法
     */
    public void saveBitmapFile(Bitmap bitmap){
        //Environment.getExternalStorageDirectory() 獲取Android外部儲存的空間,當有外部SD卡就在外部SD卡上建立。
        //沒有外部SD卡就在內部SD卡的非data/data/目錄建立目錄。(data/data/目錄才是真正的記憶體目錄。)
        //IMAGE_NAME檔案的名字,隨便起。比如(xxx.jpg)
        File tempFile = new File(Environment.getExternalStorageDirectory(), IMAGE_NAME );
        try {
            //建立一個輸出流,將資料寫入到建立的檔案物件中。
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(tempFile));
            ////30 是壓縮率,表示壓縮70%; 如果不壓縮是100,
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
           /* 為什麼要呼叫flush()方法?當FileOutputStream作為BufferedOutputStream建構函式的引數傳入,然後對BufferedOutputStream進行寫入操作,才能利用緩衝及flush()。
            檢視BufferedOutputStream的原始碼,發現所謂的buffer其實就是一個byte[]。
            BufferedOutputStream的每一次write其實是將內容寫入byte[],當buffer容量到達上限時,會觸發真正的磁碟寫入。
            而另一種觸發磁碟寫入的辦法就是呼叫flush()了。*/
            bos.flush();
            //關閉流物件
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
   最後告訴大家,可以先看看java中的檔案流和位元組流操作,以及Android的Bitmap物件,對理解上述的程式碼會很有幫助。希望能幫助到大家。共同進步,歡迎轉載和留言。一起探討。

關注微信公眾號:

相關推薦

Android壓縮圖片並且儲存本地記憶體

        親愛的同學們,相信我們在軟體開發中經常會遇到拍照,選擇相簿上傳的功能。前幾天遇到一個這樣的一個問題。後臺要求我上傳的圖片不能超過500KB,大家知道我們現在的智慧手機畫素越來越高,拍照

Android實現下載圖片儲存到SD

在檔案裡設定一個點選方法已進行點選下載: download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String

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

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

android 壓縮圖片壓縮到100K以下,並且寬高不超過1028

在android開發中,經常遇到圖片壓縮問題,由此記錄下以下壓縮方法。 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import and

Xamarin.Android 壓縮圖片並上傳到WebServices

越來越大 () exists jpeg color 文件寫入 data pen map   隨著手機的拍照像素越來越高,導致圖片贊的容量越來越大,如果上傳多張圖片不進行壓縮、質量處理很容易出現OOM內存泄漏問題。   最近做了一個項目,向webservices上傳多張照片,

android -------- 壓縮圖片檔案工具類

專案中常常遇到檔案壓縮問題,上傳檔案大小限制 今天簡單的分享一點乾貨,檔案壓縮,圖片壓縮,壓縮Bitmap 主要通過尺寸壓縮和質量壓縮,以達到清晰度最優   效果圖              原始碼地址: 

android 以追加形式寫檔案並把檔案儲存到SD

android手機記憶體本來就不大,要是老把資料放在手機裡,很明顯會讓手機的使用者體驗到什麼是“卡”,所以,我們把資料要放到SD卡中,以減少手機記憶體的使用,本文僅寫入檔案,不對讀檔案進行說明。好,go! 第一步:新建android專案,命名為Test next ->

Python下載圖片儲存本地的兩種方式

一:使用Python中的urllib類中的urlretrieve()函式,直接從網上下載資源到本地,具體程式碼:import os,stat import urllib.request img_url="https://timgsa.baidu.com/timg?imag

Android壓縮圖片到100K以下並保持不失真的高效方法

 在開發Android企業應用時,會經常上傳圖片到伺服器,而我們公司目前維護的一個專案便是如此。該專案是通過私有apn與伺服器進行互動的,聯通的還好,但移動的速度實在太慢,客戶在使用軟體的過程中,由於上傳的資訊中可能包含多張圖片,會經常出現上傳圖片失敗的問題,為了解決這個

Android Bitmap圖片處理,防止記憶體溢位

在android 中載入一張圖片,如果圖片過大就有可能會出現記憶體溢位,特別是在載入資料過多的時候,像ListView 和GridView等重複列表中,因此在處理Android圖片防止記憶體溢位就顯得特別的重要,也是很多面試中經常問到的問題,面試官通常都會讓你談

IOS 播放本地音樂(播放記憶體的MP3) 及 檔案的寫入

在IOS開發中, 每一個應用程式都擁有一個Documents的資料夾來存放自己的檔案。 在這裡為了測試, 我們首先得把mp3檔案匯入到專案中。 然後讀出資源裡的mp3檔案,寫入到documents中, 然後再從documents中讀取該mp3檔案來播放。 (在實際當中也許我

將資料儲存記憶體

實驗程式碼: package com.example.test1102; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStrea

android 壓縮圖片

將任意一張圖片壓縮成100*100的縮圖,並在ImageView上展示。 Bitmap bitmap = PicTool.decodeBitmapFromFile(tempFile.toString(),100,100); imageview.setImageBitmap

轉載 利用WWW類獲取圖片並且在unityUGUI的Image顯示

 https://www.cnblogs.com/chiwang/p/7665938.html using UnityEngine; using System.Collections; using UnityEngine.UI; public class GetSprite : Mon

Android網路URL圖片地址轉Bitmap並且儲存本地

一、網路URL圖片地址轉Bitmap public Bitmap getBitmap(String imgUrl) { InputStream inputStream=null;

Android開發 點選在本地選擇換圖片(頭像)並且儲存,例項總結。

類似於QQ、微信頭像。 廢話不多說 ,直接上程式碼 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.I

Android下載網路圖片儲存本地相簿

package com.thfund.bigtree.StarCounselor.activity; import android.content.Context; import android.content.Intent; import android.grap

Android 開發圖片儲存本地

/** * 圖片儲存到本地 方法2 * * @param bitmap */ public static void compressImagetwo(Bitmap bitmap) { try {

android webview 載入本地html並且解決多圖頓問題

使用webview載入本地html,因為本地html使用多張圖片,滑動起來卡頓,解決方法如下: 把資料夾放入assets資料夾下 Activity載入: WebView wView = (