當前位置:首頁 » 安卓系統 » android圖片過大

android圖片過大

發布時間: 2025-01-27 13:30:34

㈠ android如何載入超大解析度圖片

因為你要求圖片不能縮放,不能降低質量,而且有7M,oom是必須的,所以你能做的只能是載入你看得見的地方,意思就是說剪裁著看,先不載入,按屏幕的解析度的1.5倍或多一些進行剪裁(這個度自己控制項),當向某一個方向滑時,檢測坐標如果快超出時,載入右邊的下一幅。
這個有點類似於游戲中的地圖貼圖,也是分塊的。

㈡ Android圖片太多,而出異常,哪位高手給解決一下啊

你說的這個問題我也遇到過,在圖片不是很多的情況下,使用BitmapFactory可以解決問題,不過這終究存在隱患,期待高手現身!貌似Bitmap.recycle()方法可以釋放掉部分內存,不知道可行不

㈢ Android 高效內存-圖片內存使用優化

內容整理自網路。

在做內存優化的時候,我們發現除了解決內存泄露問題,剩下的就只有想辦法減少真實的內存佔用。而在App中,大部分內存可能被我們圖片佔用了,所以減少圖片的內存佔用可以帶來直接的效果。本文就簡單介紹一張圖片到底佔用多少內存,我們先假設我們有一張圖片時** 600 * 800** 的,圖片佔用空間大小假設是** 100KB**。

圖片內存大小跟佔用空間大小有什麼關系?

佔用空間的大小不是圖片佔用內存的大小,一些初學者可能會誤解一下。佔用空間是在磁碟上佔用的空間,內存大小是載入到內存中佔用的內存大小。兩個只是單位是一樣的,本質不是一個概念。

一張圖片到底佔用多少內存呢?(ARGB_8888編碼)

1. 圖片佔用內存的計算公式: 圖片高度 * 圖片寬度 * 一個像素佔用的內存大小

2. 所以上面的圖片佔用內存是:**800 * 600 * 4 byte = 1875KB = 1.83M **

上面的計算公式中,為什麼是4byte呢?文章後面有總結哦

圖片所在目錄對內存的影響?

在Android中,圖片的存放目錄和手機的屏幕密度影響圖片最終的大小,舉個例子:

假設我們的圖片放到 xhdpi 目錄下,那麼我們本文中的圖片佔用的內存大小如下:

屏幕密度為2的設備:800 * 600 * 4byte = 1.83M

屏幕密度為3的設備:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M =** 4.12M**

所以,計算圖片佔用內存大小的時候,要考慮圖片所在的目錄跟設備密度,這兩個因素其實影響的是圖片的高寬,android會對圖片進行拉升跟壓縮

總結

1. 圖片確實很佔用內存,內存優化先考慮圖片內存佔用;

2. 一定要避免使用大圖片,這就是.9圖很有用的原因之一;

3. 圖片的大小對內存的影響是正比關系;

4. 本文只是簡單的告知讀者怎麼計算圖片的內存大小。

大圖: 440 * 336    小圖: 220 * 168 資源目錄: xhdpi

小圖的高寬都是大圖的1/2-->小圖是原圖的1/4

界面效果:

測試設備: Coolpad   8676-M01   5.1   density=2.0

測試前准備操作: 同一款設備,設置圖片前後多次調用gc直到內存短時間內保持穩定不再變化

內存使用情況: 下圖依次是 初始內存,大圖內存,小圖內存

大圖佔用內存: 11.23 MB - 10.66 MB = 0.57 MB

小圖佔用內存: 10.81 MB - 10.66 MB = 0.15 MB

大圖小圖內存關系: 0.15 MB * 4 = 0.60 MB 約等於 0.57 MB (這是統計工具的誤差,理論上就是相等的)

同樣的方式在另外一台設備小米4c上得到的結果如下:

測試設備: Xiaomi   Mi-4c   V8.2.1.0.LXKCNDL   5.1.1   density=3.0

大圖佔用內存: 13.22 MB - 11.95 MB = 1.27 MB

小圖佔用內存: 12.27 MB - 11.95 MB = 0.32 MB

大圖小圖內存關系: 0.32 MB * 4 = 1.28 MB 約等於 1.27 MB

結論: 由此可見大圖比小圖佔用更多的內存,圖片大小(解析度)與佔用內存成正比關系

備註: 圖片在硬碟上佔用的磁碟空間大小,與在內存中佔用的內存大小完全不一樣,不是一個概念,不要混淆

根據上文中圖片大小與內存的關系,可以更加深刻的理解Android中.9圖片的作用,它不但能減少apk的體積,還能減少圖片佔用內存。

有些時候我們根本不需要圖片,而是自己繪制背景,可以在自定義View的onDraw中繪制背景,當然最方便的還是使用系統的Drawable,繪制部分交給系統去完成。

下面測試圖片與Drawable的內存佔用對比

原始圖片大小: 482 * 482

界面效果:

測試設備: Xiaomi   Mi-4c   V8.2.1.0.LXKCNDL   5.1.1

測試前准備操作: 同一款設備,設置背景前後多次調用gc直到內存短時間內保持穩定不再變化

內存使用情況: 下圖依次是 初始內存,使用圖片佔用的內存,使用Drawable佔用的內存,使用onDraw繪制佔用的內存

使用圖片佔用內存: 13.97 MB - 11.97 MB = 2.00 MB

使用Drawable佔用內存: 11.97 MB - 11.97 MB = 0.00 MB (不會是0,有誤差,只是很少)

使用onDraw繪制佔用內存: 11.98 MB - 11.97 MB = 0.01 MB

結論: 繪制背景,或者使用系統提供Drawable作為背景,會大大減少內存佔用

Drawable參考資料:

Drawable實戰解析:Android XML shape 標簽使用詳解(apk瘦身,減少內存好幫手)

Android GradientDrawable(shape標簽定義)靜態使用和動態使用(圓角,漸變實現)

「讓你的圖片最小化」一節中描述的方法:使用盡可能小的圖,使用.9,自己繪制背景或者使用Drawable來繪制背景

載入大圖片時需要對圖片進行壓縮,使用等比例壓縮方法直接在內存中處理圖片

這樣做要注意的是,圖片質量會變差,inSampleSize設置的值越大,圖片質量就越差。

有時候我們取得一張圖片,也許只是為了獲得這個圖片的一些信息,比如圖片的width、height等信息,不需要顯示到界面上,這個時候我們可以不把圖片載入到內存中。

由於Android外層是使用java,而底層使用的是C語言為圖片對象分配的內存空間。所以我們的外部雖然看起來釋放了,但里層卻並不一定完全釋放了,我們使用完圖片後最好再釋放掉里層的內存空間。

RGB(ARGB)

RGB色彩模式是工業界的一種顏色標准,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。在Android中還有包含透明度Alpha的顏色模型,即ARGB。

YUV

YUV,分為三個分量,「Y」表示明亮度(Luminance或Luma),也就是灰度值;而「U」和「V」 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。

YUV的原理是把亮度與色度分離,研究證明,人眼對亮度的敏感超過色度。利用這個原理,可以把色度信息減少一點,人眼也無法查覺這一點。

主要用於電視系統以及模擬視頻領域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的兼容問題

YUV的存儲中與RGB格式最大不同在於,RGB格式每個點的數據是連繼保存在一起的。即R,G,B是前後不間隔的保存在2-4byte空間中。而YUV的數據中為了節約空間,U,V分量空間會減小。每一個點的Y分量獨立保存,但連續幾個點的U,V分量是保存在一起的,(反正人眼一般也看不出區別).這幾個點合起來稱為macro-pixel, 這種存儲格式稱為Packed格式。另外一種存儲格式是把一幅圖像中Y,U,V分別用三個獨立的數組表示。這種模式稱為planar模式。

CMYK
  CMYK也稱作印刷色彩模式,顧名思義就是用來印刷的。印刷四分色模式是彩色印刷時採用的一種套色模式,利用色料的三原色混色原理,加上黑色油墨,共計四種顏色混合疊加,形成所謂「全彩印刷」。四種標准顏色是:

CMYK和RGB相比有一個很大的不同:RGB模式是一種發光的色彩模式,你在一間黑暗的房間內仍然可以看見屏幕上的內容;CMYK是一種依靠反光的色彩模式,我們是怎樣閱讀報紙的內容呢?是由陽光或燈光照射到報紙上,再反射到我們的眼中,才看到內容。它需要有外界光源,如果你在黑暗房間內是無法閱讀報紙的。只要是在印刷品上看到的圖像,就是CMYK模式表現的。比如期刊、雜志、報紙、宣傳畫等,都是印刷出來的,那麼就是CMYK模式的了。

CMYK原色與疊加之後的顏色對比

在不考慮透明度的情況下,一個像素點的顏色值在計算機中的表示方法有以下3種:

在Java中,float類型的變數佔32位,int類型的變數佔32位,short和char類型的變數都在16位,因此可以看出,用浮點數表示法編碼一個像素的顏色,內存佔用量是96位即12位元組;而用24位整數表示法編碼,只要一個int類型變數,佔用4個位元組(高8位空著,低24位用於表示顏色);用16位整數表示法編碼,只要一個short類型變數,佔2個位元組;因此可以看出採用整數表示法編碼顏色值,可以大大節省內存,當然,顏色質量也會相對低一些。在Android中獲取Bitmap的時候一般也採用整型編碼。

回想一下Android的BitmapConfig類中,有ARGB_8888、ARGB_4444、RGB565等常量,現在可以知道它們分別代表了什麼含義。同時也可以計算一張圖片在內存中可能佔用的大小,比如採用ARGB_8888編碼載入一張1920 1200的圖片,大概就會佔用1920 1200*4/1024/1024=8.79MB的內存。

採用低內存佔用量的編碼方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內存;

1920 1200的圖片:*

ARGB_8888:1920 1200 4/1024/1024=8.79MB

ARGB_4444,RGB565:1920 1200 2/1024/1024=4.39MB

在Android中,對圖片的使用一定要關注,大多數情況下,佔用內存多,OOM發生都是因為圖片資源使用不當。不要盲目加一個大圖到Android項目中,能使用.9進來使用,而且.9圖本身盡可能小,另外能使用繪制實現就不要加一個圖片資源。有些時候,在不影響用戶體驗的情況下,可以降低圖片素材質量,比如不需要透明度的就不要了,有些透明度用肉眼看不出來。

㈣ android怎麼把一個小圖片布滿整個屏幕

可以的。
但是圖片解析度本身不高,放大後會不清楚,就是用軟體把圖片設置為800×600就可以了。
Android設置壁紙的方法是,在待機桌面點擊Menu(菜單)鍵會出現屏幕定製菜單,選擇壁紙選項。此時屏幕可能會出現不同的菜單,選擇系統圖庫,或者壁紙庫之類的選項即可進入系統自帶的壁紙列表。選擇動態壁紙,則會進入系統自帶的動態壁紙列表。

㈤ 在android開發中,imageView內的圖片太大擋住了另外一個請問怎麼解決

兩個圖片是平分屏幕寬的可以這樣布局:使用權重

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/fatierenxingming"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:src="@drawable/fatierenxingming"/>
</LinearLayout>

㈥ android 如何壓縮png圖片位元組數

如果你只是覺得程序背景圖片大的話 這個應該是美工的問題 找個專業的美工設計下就Ok的

如果是程序中想壓縮圖片的話 網上的方法很多

下面代碼是將圖片按比例大小壓縮方法(根據Bitmap圖片壓縮)

privateBitmapcomp(Bitmapimage){

ByteArrayOutputStreambaos=newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,baos);
if(baos.toByteArray().length/1024>1024){//判斷如果圖片大於1M,進行壓縮避免在生成圖片(BitmapFactory.decodeStream)時溢出
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG,50,baos);//這里壓縮50%,把壓縮後的數據存放到baos中
}
ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();
//開始讀入圖片,此時把options.inJustDecodeBounds設回true了
newOpts.inJustDecodeBounds=true;
Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
newOpts.inJustDecodeBounds=false;
intw=newOpts.outWidth;
inth=newOpts.outHeight;
//現在主流手機比較多是800*480解析度,所以高和寬我們設置為
floathh=800f;//這里設置高度為800f
floatww=480f;//這里設置寬度為480f
//縮放比。由於是固定比例縮放,只用高或者寬其中一個數據進行計算即可
intbe=1;//be=1表示不縮放
if(w>h&&w>ww){//如果寬度大的話根據寬度固定大小縮放
be=(int)(newOpts.outWidth/ww);
}elseif(w<h&&h>hh){//如果高度高的話根據寬度固定大小縮放
be=(int)(newOpts.outHeight/hh);
}
if(be<=0)
be=1;
newOpts.inSampleSize=be;//設置縮放比例
newOpts.inPreferredConfig=Config.RGB_565;//降低圖片從ARGB888到RGB565
//重新讀入圖片,注意此時已經把options.inJustDecodeBounds設回false了
isBm=newByteArrayInputStream(baos.toByteArray());
bitmap=BitmapFactory.decodeStream(isBm,null,newOpts);
returncompressImage(bitmap);//壓縮好比例大小後再進行質量壓縮
}

【ps:看你自己的需要吧 給個地方做參考 http://my.eoe.cn/isnull/archive/564.html 你也可以搜索下 其他的方法 】

㈦ 您好,android里如何把圖片放大超過屏幕大小和拖動呢就像相冊里一樣。我試過很多辦法都不行。

是要編寫一個這樣的功能么,android提供的API裡面一般圖片都是Bitmap,可以通過Canvas.drawBItMap的方法在View進行圖片的繪制,在方法中需要進行傳入一個類型為Matrix的參數,設置Martrix的一些參數就可以進行圖片的放大的繪制,這只是顯示,也就是MVC中的View層,然後通過提供的一些觸摸函數的重寫並實現自己需要的一些功能,如拖動,實際上就是改變BitMap繪制的位置。關於觸摸的處理和圖片的繪制可以在網上進行一些教程的搜索,我就不羅列了,最終就是需要通過控制函數來改變圖片的繪制方式,這也許就是你所需要的功能。

熱點內容
sql存儲過程返回多個結果 發布:2025-01-28 03:24:03 瀏覽:462
長安歐尚科賽哪個配置值得購買 發布:2025-01-28 03:19:35 瀏覽:115
c全排列演算法 發布:2025-01-28 03:18:16 瀏覽:753
梵蒂岡頂級時裝ftp 發布:2025-01-28 03:03:36 瀏覽:694
手游腳本有前途嗎 發布:2025-01-28 02:46:55 瀏覽:378
抓包編程 發布:2025-01-28 02:42:41 瀏覽:929
安卓平板上怎麼設置熱點 發布:2025-01-28 02:36:33 瀏覽:717
如何在手機上壓縮圖片 發布:2025-01-28 02:34:09 瀏覽:989
伺服器ip掛上公網 發布:2025-01-28 02:31:15 瀏覽:978
吃雞配置需要什麼條件 發布:2025-01-28 02:26:15 瀏覽:9