我們都知道顏色經(jīng)常用ARGB來(lái)表示,A表示Alpha,即透明度;R表示red,即紅色;G表示green,即綠色;B表示blue,即藍(lán)色。Bitmap的色彩也是用ARGB來(lái)表示的

業(yè)務(wù)包括:企業(yè)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站開(kāi)發(fā)、商城網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷推廣等服務(wù),并且涵蓋域名申請(qǐng)、虛擬空間、云服務(wù)器、等互聯(lián)網(wǎng)基礎(chǔ)服務(wù);創(chuàng)新互聯(lián)聯(lián)建站以互聯(lián)網(wǎng)的創(chuàng)新理念,成熟完善的建站體系,開(kāi)拓進(jìn)取的精神,專業(yè)的解決方案和顧問(wèn)咨詢服務(wù),幫助客戶在互聯(lián)網(wǎng)時(shí)代提升形象、把握商機(jī)、實(shí)現(xiàn)價(jià)值,提高企業(yè)的核心競(jìng)爭(zhēng)力。
我們都知道在Android 中,圖片最終是一bitmap 的方式表示,那么Android中,一張圖片的內(nèi)存大小改怎么計(jì)算呢,首先我們了解幾個(gè)概念
弄清了這幾個(gè)概念,那么我們就可以計(jì)算不同圖片格式的的內(nèi)存占用大小,假設(shè)有一張480x800的圖片
四個(gè)格式下所占的內(nèi)存如下
那么在圖片占用空間上,按照上面的理解,是不是說(shuō)圖片分辨率一樣,所占的內(nèi)存空間就是一樣呢?
其實(shí),如果要理解這個(gè)問(wèn)題,我們其實(shí)要了解圖片占用的硬盤(pán)空間和內(nèi)存空間兩個(gè)概念
那么這個(gè)是怎么得來(lái)的呢? 按照內(nèi)存大 計(jì)算方式,分辨率一樣,占用的大小應(yīng)該是一樣的,為什么圖片一和圖片二 同樣都是1920 * 1080 的圖片,占用硬盤(pán)空間差異這么大, 圖片一占用到1.25M 圖片二占用268K,這是為什么呢,影響愿意有二.
ok,本篇文章完
在開(kāi)發(fā)手機(jī)應(yīng)用的時(shí)候,內(nèi)存是有限的,那使用的時(shí)候,就要合理的運(yùn)用和釋放。
那么最占用內(nèi)存的,估計(jì)也是就圖片了,有時(shí)候,需要在加載一些大量的圖片。但是,往往回報(bào)內(nèi)存溢出的錯(cuò)誤。看看圖片的大小呢,也
不大,也就20KB左右,為什么還是很占內(nèi)存呢?
原來(lái),將圖片轉(zhuǎn)成bitmap 來(lái)使用的時(shí)候,圖片所占的內(nèi)存,不是它原來(lái)的大小,是與 圖片的寬度,高度,和顏色深度有關(guān)系。
圖片實(shí)際占用的內(nèi)存大小 = width * height * 顏色深度
顏色深度:
Bitmap.Config ALPHA_8
Bitmap.Config ARGB_4444
Bitmap.Config ARGB_8888
Bitmap.Config RGB_565
A R G B
透明度 紅色 綠色 藍(lán)色
其實(shí)這都是色彩的存儲(chǔ)方法:我們知道ARGB指的是一種色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其實(shí)所有的可
見(jiàn)色都是右紅綠藍(lán)組成的,所以紅綠藍(lán)又稱為三原色,每個(gè)原色都存儲(chǔ)著所表示顏色的信息值
Bitmap.Config ARGB_4444 每個(gè)像素 占四位
Bitmap.Config ARGB_8888 32 每個(gè)像素 占八位
Bitmap.Config RGB_565 16 R占5位 R占6位 B占5位 沒(méi)有透明度(A)
說(shuō)白了就ALPHA_8就是Alpha由8位組成
ARGB_4444就是由4個(gè)4位組成即16位,
ARGB_8888就是由4個(gè)8位組成即32位,
RGB_565就是R為5位,G為6位,B為5位共16位
由此可見(jiàn):
ALPHA_8 代表8位Alpha位圖
ARGB_4444 代表16位ARGB位圖
ARGB_8888 代表32位ARGB位圖
eg: 一張20KB的圖片,寬1024(px)*高1024(px)*圖片的顏色模式,就是它所占的真實(shí)的內(nèi)存。
2個(gè)基本原則
既然需要的內(nèi)存公式已得到,那優(yōu)化就顯而易見(jiàn)了,無(wú)非就是減小的這三個(gè)參數(shù)的值,具體的策略如下:
這里我們將圖片分為2種情況來(lái)探討:
圖片占用的內(nèi)存 大小為:
為什么mipmap不在這種情況的考慮范圍之內(nèi)呢?
因?yàn)閙ipmap是Android系統(tǒng)為了避免Launcher Icon變形而添加的資源目錄,也就是說(shuō),mipmap中的圖片不會(huì)被縮放。所以Google也不推薦將除Launcher Icon之外的圖片放在mipmap目錄中。
本地圖片通常都是通過(guò)Android提供的BitmapFactory來(lái)加載的, 這里看幾個(gè)常用的API:
圖片的優(yōu)化可通過(guò)Options參數(shù)來(lái)實(shí)現(xiàn)(Options的介紹可參考 從fresco 看圖片優(yōu)化 :
inPreferredConfig的取值為Bitmap.Config類型(這里只考慮以下幾種情況),它是一個(gè)枚舉類型,用來(lái)設(shè)置每個(gè)像素需要的字節(jié)數(shù):
1.jpeg和gif
2.webp
3.png8, png24, png32
網(wǎng)絡(luò)圖片通常我們都是使用開(kāi)源庫(kù)進(jìn)行加載, 所以不需要拿到Bitmap再進(jìn)行縮放或裁剪。
這時(shí)可讓后臺(tái)實(shí)現(xiàn)網(wǎng)絡(luò)圖片的裁剪,即:根據(jù)圖片的請(qǐng)求參數(shù)返回合適的尺寸,最大也只需要控件的大小即可。
再大也沒(méi)意義,不僅浪費(fèi)流量,還占用內(nèi)存。
如果你的APP中有很多圖片,那么可對(duì)圖片的寬高根據(jù)設(shè)備的內(nèi)存情況進(jìn)行適當(dāng)?shù)目s小:
盡量為所有分辨率創(chuàng)建資源 資源匹配分辨率 = 減少不必要的縮放,從而提高UI繪制效率
對(duì)于一個(gè)多圖片的APP來(lái)說(shuō),圖片所占內(nèi)存的優(yōu)化是一項(xiàng)必不可少的工作。
總的來(lái)說(shuō),其優(yōu)化也就是通過(guò) 縮放 和指定 Bitmap.Config的值 來(lái)實(shí)現(xiàn)的,只是不同位置,不同格式的圖片有所差異而已。
;utm_source=weixinqun
1、不同的手機(jī)、不同的像素、不同的設(shè)置,乃至同一部手機(jī)在同一個(gè)設(shè)置下、拍攝不同的場(chǎng)景,都可能導(dǎo)致照片大小不一樣。
2、這個(gè)跟你的手機(jī)照相機(jī)圖片質(zhì)量設(shè)置有關(guān),所以安卓手機(jī)照片在10MB完全在正常范圍之內(nèi),照片越清晰占得內(nèi)存就越大。
文件的大小不一樣,是因?yàn)閷傩圆煌?/p>
1.壓縮格式不一樣,壓縮算法不同。比如JPG文件就比較小,BMP文件就非常大。JPG是壓縮比最好的圖片格式之一。
2、壓縮質(zhì)量不一樣。同樣是JPG,壓縮質(zhì)量也是有區(qū)別的。可以選擇10%的壓縮質(zhì)量,效果非常差,但90%的質(zhì)量,幾乎和不壓縮一樣。一般,JPG的壓縮比在70%以上,就和原圖的差距不大。
像素就相當(dāng)于人的個(gè)子。兩個(gè)人個(gè)子一樣高,說(shuō)明不了什么,可能性別都不一樣。圖片也是一樣,像素只是畫(huà)面的大小,其它方面,完全是另一回事。
1、將圖片轉(zhuǎn)化為縮略圖再加載:代碼如下 1 BitmapFactory.Options options = new BitmapFactory.Options();2 options.inSampleSize = 2;3 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);該段代碼即是讀取1.png的縮略圖,長(zhǎng)度、寬度都只有原圖片的1/2。圖片大小減少,占用的內(nèi)存自然也變小了。這么做的弊端是圖片質(zhì)量變差,inSampleSize的值越大,圖片的質(zhì)量就越差。由于各手機(jī)廠商縮放圖片的算法不同,在不同手機(jī)上的縮放圖片質(zhì)量可能會(huì)不同。筆者就遭遇過(guò)moto手機(jī)上圖片縮放后質(zhì)量可以接受,三星手機(jī)上同樣的縮放比例,質(zhì)量卻差很多的情況。2、用ARBG_4444顏色模式加載圖片:Android中有四種,分別是:ALPHA_8:每個(gè)像素占用1byte內(nèi)存ARGB_4444:每個(gè)像素占用2byte內(nèi)存ARGB_8888:每個(gè)像素占用4byte內(nèi)存RGB_565:每個(gè)像素占用2byte內(nèi)存Android默認(rèn)的顏色模式為ARGB_8888,這個(gè)顏色模式色彩最細(xì)膩,顯示質(zhì)量最高。但同樣的,占用的內(nèi)存也最大。代碼如下 1 BitmapFactory.Options options = new BitmapFactory.Options();2 options.inPreferredConfig = Bitmap.Config.ARGB_4444; 3 Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);以上代碼即是將1.png以ARGB_4444模式讀出。內(nèi)存減少雖然不如第一種方法明顯,但是對(duì)于大多數(shù)圖片,看不出與ARGB_8888模式有什么差別。不過(guò)在讀取有漸變效果的圖片時(shí),可能有顏色條出現(xiàn)。另外,會(huì)影響圖片的特效處理。3、調(diào)用圖片的recycle()方法:這個(gè)其實(shí)不是真正降低圖片內(nèi)存的方法。主要目的是標(biāo)記圖片對(duì)象,方便回收?qǐng)D片對(duì)象的本地?cái)?shù)據(jù)。圖片對(duì)象的本地?cái)?shù)據(jù)占用的內(nèi)存最大,而且與程序Java部分的內(nèi)存是分開(kāi)計(jì)算的。所以經(jīng)常出現(xiàn)Java heap足夠使用,而圖片發(fā)生OutOfMemoryError的情況。在圖片不使用時(shí)調(diào)用該方法,可以有效降低圖片本地?cái)?shù)據(jù)的峰值,從而減少OutOfMemoryError的概率。不過(guò)調(diào)用了recycle()的圖片對(duì)象處于“廢棄”狀態(tài),調(diào)用時(shí)會(huì)造成程序錯(cuò)誤。所以在無(wú)法保證該圖片對(duì)象絕對(duì)不會(huì)被再次調(diào)用的情況下,不建議使用該方法。特別要注意已經(jīng)用setImageBitmap(Bitmap img)方法分配給控件的圖片對(duì)象,可能會(huì)被系統(tǒng)類庫(kù)調(diào)用,造成程序錯(cuò)誤。4、使用Matrix對(duì)象放大的圖片如何更改顏色模式:雖然使用Matrix對(duì)象放大圖片,必定會(huì)耗費(fèi)更多的內(nèi)存,但有時(shí)候也不得不這樣做。放大后的圖片使用的ARGB_8888顏色模式,就算原圖片是ARGB_4444顏色模式也一樣,而且沒(méi)有辦法在放大時(shí)直接指定顏色模式。可以采用以下辦法更改圖片顏色模式。代碼如下 Matrix matrix = new Matrix();float newWidth = 200;//圖片放大后的寬度f(wàn)loat newHeight = 300;//圖片放大后的長(zhǎng)度matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);//得到放大的圖片img2 = img1.copy(Bitmap.Config.ARGB_4444, false);//得到ARGB_4444顏色模式的圖片img = null;img1 = null;這里比起原來(lái)的圖片額外生成了一個(gè)圖片對(duì)象img1。但是系統(tǒng)會(huì)自動(dòng)回收img1,所以實(shí)際內(nèi)存還是減少了。
當(dāng)前標(biāo)題:android圖片內(nèi)存,android圖片內(nèi)存中
分享地址:http://chinadenli.net/article33/dsgijps.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站維護(hù)、Google、企業(yè)建站、虛擬主機(jī)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)