使用Android系統(tǒng)相機(jī)捕獲圖片(四)

寫(xiě)文章的目的

  1. 靜下心來(lái)學(xué)習(xí)
  2. 知識(shí)點(diǎn)的積累
  3. 總結(jié)胞锰,做筆記

導(dǎo)讀

解決上一篇留下的問(wèn)題:

獲取了這么大的圖片并顯示,內(nèi)存肯定消耗很大兢榨,有什么優(yōu)化嗎嗅榕?

需求

調(diào)用系統(tǒng)相機(jī)捕獲圖片,并合理顯示圖片吵聪。

代碼解構(gòu)

  • 調(diào)用系統(tǒng)相機(jī)捕獲圖片前面幾篇已解決凌那,此處不表。
  • 合理顯示圖片:主要是內(nèi)存上優(yōu)化吟逝。

1.回顧一下帽蝶,上一篇中我們是如何加載拍照后的圖片:直接通過(guò)BitmapFactory去解碼圖片路徑。

Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath);
Log.i("--bitmap1--", bitmap1.getHeight() + "<===>" + bitmap1.getWidth());
//I/--bitmap1--: 4608<===>3456
imageView.setImageBitmap(bitmap);

2.快速加載大圖块攒,獲取采樣后的圖片励稳。decodeFile()還有一個(gè)重載方法佃乘,多一個(gè)參數(shù)BitmapFactory.Options,通過(guò)Options.inSampleSize的值去設(shè)置采樣比例驹尼。比如:Options.inSampleSize = 8表示獲取后的bitmap寬高均縮小了8倍趣避,面積縮小了8*8倍。

            //1.快速加載大圖扶欣,獲取采樣后的圖片 1/8比例 對(duì)比打印:其實(shí)是寬高都縮小8倍
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            Bitmap bitmap2 = BitmapFactory.decodeFile(mImageFilePath, options);
            Log.i("--bitmap2--", bitmap2.getHeight() + "<===>" + bitmap2.getWidth());
            //I/--bitmap2--: 576<===>432
            imageView.setImageBitmap(bitmap2);

3.了解了簡(jiǎn)單的采樣方法后千扶,接下來(lái)我們按照具體環(huán)境配置比例料祠,盡可能地填充顯示范圍:比如顯示屏寬高。

大部分應(yīng)該是此種需求澎羞,需要去計(jì)算采樣的比例髓绽。這個(gè)時(shí)候我們需要Options的另一個(gè)屬性inJustDecodeBounds:如果設(shè)置為true,解碼器會(huì)返回null妆绞,不會(huì)返回bitmap顺呕,但是BitmapFactory.Options.outxxx屬性會(huì)被設(shè)置值,運(yùn)行解碼器去查詢bitmap括饶,不會(huì)將bitmap加載進(jìn)內(nèi)存株茶。

           //2.按照具體環(huán)境配置比例赫编,盡可能地填充顯示范圍:比如顯示屏寬高
            //接收屏幕寬高 x==width;y==height
            Point disPlayer = new Point();
            //獲取屏幕寬高
            getWindowManager().getDefaultDisplay().getSize(disPlayer);
            //創(chuàng)建解碼圖像的Options
            BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
            //inJustDecodeBounds如果設(shè)置為true点弯,解碼器會(huì)返回null,不會(huì)返回bitmap葛家,
            // 但是BitmapFactory.Options.outxxx屬性會(huì)被設(shè)置值技羔,運(yùn)行解碼器去查詢bitmap僵闯,不會(huì)將bitmap加載進(jìn)內(nèi)存。
            bitmapOptions.inJustDecodeBounds = true;
            //讓解碼器去查詢?cè)搱D片(返回bitmap為null藤滥,但是給BitmapFactory.Options.outxxx屬性設(shè)置值)
            BitmapFactory.decodeFile(mImageFilePath, bitmapOptions);
            //顯示屏寬高與圖片寬高對(duì)比
            //屏幕高 disPlayer.y
            //屏幕寬disPlayer.x
            //圖片高 bitmapOptions.outHeight
            //圖片寬 bitmapOptions.outWidth
            //高之比
            int heightRatio = (int) Math.ceil(bitmapOptions.outHeight / ((float) disPlayer.y));
            //寬之比
            int widthRatio = (int) Math.ceil(bitmapOptions.outWidth / ((float) disPlayer.x));
            //解釋下Math.round(),Math.ceil(),Math.floor()
            //1鳖粟,Math.round():round是附近的意思,取四舍五入
            //2拙绊,Math.ceil():ceil是天花板的意思向图,取上限值
            //3,Math.floor():floor是地板的意思标沪,取下限值
            //比如我打印的屏幕高: 2034张漂;圖片高: 4608;比值大概是2.+谨娜,ceil之后的值就是3航攒。
            Log.i("--屏幕高 ", disPlayer.y + "");
            Log.i("--屏幕寬 ", disPlayer.x + "");
            Log.i("--圖片高 ", bitmapOptions.outHeight + "");
            Log.i("--圖片寬 ", bitmapOptions.outWidth + "");
            Log.i("--高之比", heightRatio + "");
            Log.i("--寬之比", widthRatio + "");
            //I/--屏幕高: 2034
            //I/--屏幕寬: 1080
            //I/--圖片高: 4608
            //I/--圖片寬: 3456
            //I/--高之比: 3
            //I/--寬之比: 4
            if (heightRatio > 1 && widthRatio > 1) {
                //兩個(gè)比例都大于1
                //采樣的比例取heightRatio和widthRatio中的最大值
                bitmapOptions.inSampleSize = Math.max(heightRatio, widthRatio);
            }
            //設(shè)置為false取解碼圖片
            bitmapOptions.inJustDecodeBounds = false;
            //獲取縮小之后的圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath, bitmapOptions);
            imageView.setImageBitmap(bitmap);
            Log.i("--縮小后寬:",bitmap.getWidth()+"");
            Log.i("--縮小后高:",bitmap.getHeight()+"");
            //I/--縮小后寬:: 864
            //I/--縮小后高:: 1152

4.結(jié)果顯示。(根據(jù)屏幕寬高采樣.jpg)(直接縮小8倍采樣.jpg)


根據(jù)屏幕寬高采樣

直接縮小8倍采樣

總結(jié)

  • 該篇文章解決的問(wèn)題:減少顯示圖片時(shí)的內(nèi)存消耗
  • 兩個(gè)重載函數(shù)BitmapFactory.decodeFile(String pathName, Options opts)BitmapFactory.decodeFile(String pathName)
  • Options中兩個(gè)重要的屬性inSampleSize采樣比例和inJustDecodeBounds趴梢。

代碼樣例

1.源碼地址
2.在上一篇的代碼基礎(chǔ)上修改onActivityResult()即可漠畜。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == IMAGE_RESULT) {
            //這里不能通過(guò)Intent對(duì)象去獲取"data"币他,
            // 因?yàn)樵诖蜷_(kāi)相機(jī)時(shí)已經(jīng)通過(guò)MediaStore.EXTRA_OUTPUT告訴相機(jī):你把圖片放在我傳給你的Uri中
            //所以可以直接通過(guò)BitmapFactory在存儲(chǔ)路徑中獲取圖片

            /*Bitmap bitmap1 = BitmapFactory.decodeFile(mImageFilePath);
            Log.i("--bitmap1--", bitmap1.getHeight() + "<===>" + bitmap1.getWidth());
            //I/--bitmap1--: 4608<===>3456*/

           /* //1.快速加載大圖,獲取采樣后的圖片 1/8比例 對(duì)比打鱼灸:其實(shí)是寬高都縮小8倍
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            Bitmap bitmap2 = BitmapFactory.decodeFile(mImageFilePath, options);
            Log.i("--bitmap2--", bitmap2.getHeight() + "<===>" + bitmap2.getWidth());
            //I/--bitmap2--: 576<===>432
            imageView.setImageBitmap(bitmap2);*/

            //2.按照具體環(huán)境配置比例蝴悉,盡可能地填充顯示范圍:比如顯示屏寬高
            //接收屏幕寬高 x==width;y==height
            Point disPlayer = new Point();
            //獲取屏幕寬高
            getWindowManager().getDefaultDisplay().getSize(disPlayer);
            //創(chuàng)建解碼圖像的Options
            BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
            //inJustDecodeBounds如果設(shè)置為true,解碼器會(huì)返回null瘾敢,不會(huì)返回bitmap拍冠,
            // 但是BitmapFactory.Options.outxxx屬性會(huì)被設(shè)置值,運(yùn)行解碼器去查詢bitmap簇抵,不會(huì)將bitmap加載進(jìn)內(nèi)存庆杜。
            bitmapOptions.inJustDecodeBounds = true;
            //讓解碼器去查詢?cè)搱D片(返回bitmap為null,但是給BitmapFactory.Options.outxxx屬性設(shè)置值)
            BitmapFactory.decodeFile(mImageFilePath, bitmapOptions);
            //顯示屏寬高與圖片寬高對(duì)比
            //屏幕高 disPlayer.y
            //屏幕寬disPlayer.x
            //圖片高 bitmapOptions.outHeight
            //圖片寬 bitmapOptions.outWidth
            //高之比
            int heightRatio = (int) Math.ceil(bitmapOptions.outHeight / ((float) disPlayer.y));
            //寬之比
            int widthRatio = (int) Math.ceil(bitmapOptions.outWidth / ((float) disPlayer.x));
            //解釋下Math.round(),Math.ceil(),Math.floor()
            //1碟摆,Math.round():round是附近的意思晃财,取四舍五入
            //2,Math.ceil():ceil是天花板的意思典蜕,取上限值
            //3断盛,Math.floor():floor是地板的意思,取下限值
            //比如我打印的屏幕高: 2034愉舔;圖片高: 4608钢猛;比值大概是2.+,ceil之后的值就是3轩缤。
            Log.i("--屏幕高 ", disPlayer.y + "");
            Log.i("--屏幕寬 ", disPlayer.x + "");
            Log.i("--圖片高 ", bitmapOptions.outHeight + "");
            Log.i("--圖片寬 ", bitmapOptions.outWidth + "");
            Log.i("--高之比", heightRatio + "");
            Log.i("--寬之比", widthRatio + "");
            //I/--屏幕高: 2034
            //I/--屏幕寬: 1080
            //I/--圖片高: 4608
            //I/--圖片寬: 3456
            //I/--高之比: 3
            //I/--寬之比: 4
            if (heightRatio > 1 && widthRatio > 1) {
                //兩個(gè)比例都大于1
                //采樣的比例取heightRatio和widthRatio中的最大值
                bitmapOptions.inSampleSize = Math.max(heightRatio, widthRatio);
            }
            //設(shè)置為false取解碼圖片
            bitmapOptions.inJustDecodeBounds = false;
            //獲取縮小之后的圖片
            Bitmap bitmap = BitmapFactory.decodeFile(mImageFilePath, bitmapOptions);
            imageView.setImageBitmap(bitmap);
            Log.i("--縮小后寬:",bitmap.getWidth()+"");
            Log.i("--縮小后高:",bitmap.getHeight()+"");
            //I/--縮小后寬:: 864
            //I/--縮小后高:: 1152
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厢洞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子典奉,更是在濱河造成了極大的恐慌躺翻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卫玖,死亡現(xiàn)場(chǎng)離奇詭異公你,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)假瞬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門陕靠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人脱茉,你說(shuō)我怎么就攤上這事剪芥。” “怎么了琴许?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵税肪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)益兄,這世上最難降的妖魔是什么锻梳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮净捅,結(jié)果婚禮上疑枯,老公的妹妹穿的比我還像新娘。我一直安慰自己蛔六,他們只是感情好荆永,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著国章,像睡著了一般具钥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捉腥,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天氓拼,我揣著相機(jī)與錄音你画,去河邊找鬼抵碟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坏匪,可吹牛的內(nèi)容都是我干的拟逮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼适滓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敦迄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起凭迹,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤罚屋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嗅绸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脾猛,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鱼鸠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猛拴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚀狰,死狀恐怖愉昆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麻蹋,我是刑警寧澤跛溉,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響倒谷,放射性物質(zhì)發(fā)生泄漏蛛蒙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一渤愁、第九天 我趴在偏房一處隱蔽的房頂上張望牵祟。 院中可真熱鬧,春花似錦抖格、人聲如沸诺苹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)收奔。三九已至,卻和暖如春滓玖,著一層夾襖步出監(jiān)牢的瞬間坪哄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工势篡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翩肌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓禁悠,卻偏偏與公主長(zhǎng)得像念祭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碍侦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348