當前位置:首頁 » 安卓系統 » android尺寸壓縮

android尺寸壓縮

發布時間: 2023-04-12 17:17:31

A. Android圖片壓縮-大小與質量壓縮以及圖片保存

一、前言:

2.質量壓縮
注意:

第二次壓縮之前都要先清空 baos.reset(); 再進行壓縮 image.compress(Bitmap.CompressFormat.JPEG, quality, baos);
有時候我們採用質量壓縮沒有效果,有可能是每次壓縮的質量過小,所以我們可以嘗試修改壓縮質量(quality)是10;
quality壓縮機提示,0-100。0表示壓縮
小尺寸,100意味著最大質量的壓縮。一些
格式,如無損的PNG,將忽略質量設定;

3.混合方式壓縮

鏈接: https://www.jianshu.com/p/12835d5ebc72

B. Android 圖片選擇(ImageSelector) (拍照,裁剪,壓縮,查看)

1.遍歷sdcard文件夾(指定層次深度 searchDeep ),如果文件夾發現圖片 , 添加到已搜索到圖片的文件列表中,並跳入下一個文件夾搜索

2.使用 ContentResolver 搜索 添加搜索標簽(png,jpg,jpeg,gif 等) 優點:更快速

壓縮調用

第一步-->

采樣率壓縮:設置 BitmapFactory.Options.inSampleSize 大小

第二步-->

PNG:尺寸壓縮( Config:ARGB_4444 ,工具: Canvas );

JPG:尺寸壓縮( Config:ARGB_565 ,工具: Canvas )+壓縮質量( bitmap.compress() )

注 :

1.GIF不做壓縮處理

2.尺寸壓縮:改變寬高(png,jpg)

3.壓縮質量:改變文件大小(適用jpg,png無效)

C. android 圖片質量壓縮和尺寸壓縮有什麼區別

圖片有三種存在形式:硬碟上時是file,網路傳輸時是stream,內存中是stream或bitmap,所謂的質量壓縮,它其實只能實現對 file的影響,你可以把一個file轉成bitmap再轉成file,或者直接將一個bitmap轉成file時,這個最橡知終的扮坦file是被壓縮過的,但 是中間的bitmap並沒有被壓縮(或者說幾乎沒有被壓縮,我不確定),因為bigmap在內存中的大小是按像素計算的,也就是width * height,對於質量壓縮,並不會改變圖片的像素,所以就算質量被壓縮了,但是bitmap在內存的佔有率還是沒變小,但你做成file時,它確實變廳如桐小 了;

而尺寸壓縮由於是減小了圖片的像素,所以它直接對bitmap產生了影響,當然最終的file也是相對的變小了;

D. 安卓手機怎麼壓縮圖片並且保持尺寸不變

部分手機支持解壓功能。操作:我的文件-(設備存儲)-菜單鍵-選擇項目(選項)-勾選需要解壓縮的文件-菜單鍵-壓縮文檔-創建壓縮文件名稱-確定即可,文件壓縮格式為ZIP。
如需解壓縮文件:勾選ZIP格式的壓縮文件-菜單鍵-解壓縮至目前文件夾。

E. android 縮放和壓縮的區別

android 縮放和壓縮圖片可以如下解釋:

壓縮圖片
這里簡單的將一個圖片文件轉換為 Bitmap ,並且在轉換的過程中對圖片質量進行簡單壓縮:
bitmap.compress(Bitmap.CompressFormat.JPEG, int quality, FileOutputStream fos);

注意這里的 quality 的范圍為 0~100 ,經過測試如果這個值設置比較低的話圖片會非常不清晰, 基本不可用, 0~100 的值可以參考類似Photoshop之類輸出圖片時選擇的圖片質量.
此方法只是單純對圖片質量進行處理, 並不會改變其大小, 如果需要改變圖片文件的大小, 最好是使用縮放, 這個可以在保證一定的圖片清晰度的情況下減少了圖片大小, 畢竟手機屏幕就那麼點, 你把 2000px * 1000px 的圖片改為 500px * 250px 在手機用戶看來也不會有太嚴重的不適感, 而如果你只設置圖片的 quality 想來改變文件大小, 你最後會發現得到的是一個 2000px * 1000px 的幾個色塊.
縮放圖片
先提代碼看看:

[java] view plain
/**
* 保持長寬比縮小Bitmap
*
* @param bitmap
* @param maxWidth
* @param maxHeight
* @return
*/
public Bitmap resizeBitmap(Bitmap bitmap, int maxWidth, int maxHeight) {

int originWidth = bitmap.getWidth();
int originHeight = bitmap.getHeight();

// no need to resize
if (originWidth < maxWidth && originHeight < maxHeight) {
return bitmap;
}

int width = originWidth;
int height = originHeight;

// 若圖片過寬, 則保持長寬比縮放圖片
if (originWidth > maxWidth) {
width = maxWidth;

double i = originWidth * 1.0 / maxWidth;
height = (int) Math.floor(originHeight / i);

bitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
}

// 若圖片過長, 則從上端截取
if (height > maxHeight) {
height = maxHeight;
bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height);
}

// Log.i(TAG, width + " width");
// Log.i(TAG, height + " height");

return bitmap;
}

這里演示是將圖片縮小到一個max范圍內, 而不是直接將變成硬性的變成某個尺寸的圖片, 因為一般來說這種設置max的方式符合大部分需要, 如果必須將圖片變成某個指定尺寸可以直接使用 Bitmap.createScaledBitmap 方法, 也是下面要介紹的.
此函數主要就是使用了 Bitmap 的兩個靜態方法, 一個是:
public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)

此方法就會把一個 Bitmap 圖片 縮放 成指定的尺寸.

F. 如何動態載入android的so文件,如何壓縮apk尺寸

您好,很高興為您解答。

一、 工具集介紹 (項目地址: https://github.com/liyuming1978/NativeLibCompression)
安卓壓縮工具集提供了一個極為簡潔的方法,能夠比安卓原有的Zip提供更高壓縮比的存儲應用內的so文件 (後期版本還可以支持壓縮動態載入的jar包,以及游戲資源文件),同時提供了應用內網路更新下載壓縮文件的方法,使得應用可以將部分so存儲到雲端,減小應用的尺寸。

壓縮原理: 壓縮工具會把所有的so使用LZMA演算法壓縮到assert目錄,應用在第一次啟動的時候,會解壓到應用的私有目錄下

二、 工具集組成
工具集為一個安裝程序,建議安裝在默認路徑下,安裝在program files下在win7可能有讀寫許可權的問題導致一些異常

安裝後,你可以看見4個目錄,此目錄內都含有源碼
安裝後的四個目錄如下

其中 ApkLibComrepss 為java命令行程序的源碼,在此目錄的bin子目錄中,你可以找到ApkCompress.jar ,使用這個文件可以把一個普通的apk文件轉換為壓縮的apk文件
CompressDemo為一個樣例代碼,你可以參考這個代碼知道如何整合壓縮的SDK。
DecRawso是壓縮的SDK,你的開發工程需要引用這個SDK,並進行一些源碼上的修改,才能整合壓縮的功能
RawsoCreator為windows下的轉換工具, 這個工具一般無需使用, 僅僅在調試和二次開發壓縮SDK的時候使用。
三、 如何整合壓縮SDK
打開CompressDemo,我們以這個工程為例子講解如何整合壓縮SDK
1. 首先需要引入DecRawso工程

2. 然後需要在你的工程內最初始的地方調用DecRawso.NewInstance。在此demo工程內,是在MainActivity.java的OnCreate內調用了此方法, 此方法是創建了一個解壓的唯一實例。注意:此方法是非同步的,所以你可以傳入一個handler接受非同步解碼完成的消息,如果同時傳入參數showProgress=true,SDK內會產生一個進度對話框以阻塞主進程。不推薦使用DecRawso.NewInstance(mContext,null,false);的方式,此方式不接受任何消息,且無進度對話框,解壓會在後台自動完成,並且在應用第一次load so的時候阻塞直到後台解壓完成。所以如果阻塞時間過長,可能會導致應用無響應。
3. 修改load so文件的方法:所有的System.loadlibrary(***)改為 System.load(DecRawso.GetInstance().GetPath(「***"));
新版本, 這步可以省略了,sdk會修改system的libaray載入路徑,一般情況下,系統升級不會出問題 (非正規代碼,小概率會隨android升級修改新的代碼),如果方便的話,還是採用System.load(DecRawso.GetInstance().GetPath(「***"))

經過這幾個簡單的步驟,壓縮的SDK已經整合到工程內了。

四、 如何壓縮發布APK
使用ApkCompress.jar壓縮發布APK。 此工具為命令行工具。一般的此命令使用方式為:在命令行運行ComPressApk.jar-a C:/my/test.apk -k c:/key *** ### alias -x86http://www.test.com (也可以運行 java –jarComPressApk.jar )
-a 後面跟apk路徑名, 可以不是全路徑
-k 後面是簽名文件[key storepasskeypass alias name] ,key可以不是全路徑名 (name 如果不寫, 默認就是CERT)
-x86 表示需要存儲x86庫文件在雲端, 後面跟以http://開頭的鏈接,最後實際的存儲位置應該為 http://www.test.com/cloudrawso_x86
命令執行完以後, 會生成test_CompressAlign.apk. 這個apk就是壓縮後的apk
五、 開發模式和壓縮模式
為了方便開發,在實現開發的過程中(修改了源碼支持壓縮後),也可以不壓縮so,apk也可以正常運行,壓縮的SDK內部會自動判斷是否有壓縮包, 如果沒有壓縮包,則載入的路徑恢復成android默認的路徑。所以最方便的開發是,先整合代碼,在開發過程中和原來一樣開發(不壓縮),在發布的時候才壓縮apk
六、 X86和ARM庫混合調用
在實現開發過程中,可能會有某些第三方庫確實沒有x86版本,通常情況下ISV並不在x86目錄下放置arm的第三方庫,那麼在實際運行過程中會導致缺庫現象的發生。在缺庫的情況下,壓縮的SDK會在x86設備上自動解壓arm的壓縮包,避免缺庫現象的發生。(只有真正載入了缺失的庫才是缺庫,庫文件不一致並不一定就是缺庫)
但是顯然這樣會導致運行的低效率,如果在第三方so和x86的庫完全沒有相互引用的情況下(也就是說這些庫都是java層使用JNI調用的,在native層沒有相互調用),可以拷貝arm的第三方庫到x86目錄下,這樣就不會出現缺庫的情況。當然這種情況會導致arm庫多餘的拷貝,在以前的zip壓縮情況下,會使得壓縮包變大,但是在新的LZMA壓縮情況下,庫大小完全不會增大,因為LZMA壓縮由於字典比較大,能夠盡可能的壓縮關聯的幾個文件,如果文件完全相同,LZMA的壓縮會和單個文件基本一致。

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

G. Android中壓縮圖片指定大小

注意看這句話,bit.compress(CompressFormat.PNG, 100, baos);
那裡的數字表示 如果不壓縮是100,表示壓縮率為0。
如果是70,就表示壓縮率是70,表示壓縮30%;
所以你的倒數第二句話表示沒有壓縮。

以下是我壓縮的方法,望採納。

/**
* 圖像壓縮並保存到本地
* 返回處理過的圖片
*
*/
private Bitmap
saveImage(String fileName,Bitmap bit) {

File file = new
File(fileName);
if (!file.exists()) {
try
{
file.createNewFile();
} catch (IOException e)
{
e.printStackTrace();
}
}
try
{
ByteArrayOutputStream stream = new
ByteArrayOutputStream();
bit.compress(CompressFormat.JPEG, 70,
stream);
// 70 是壓縮率,表示壓縮30%; 如果不壓縮是100,表示壓縮率為0
FileOutputStream os =
new
FileOutputStream(file);
os.write(stream.toByteArray());
os.close();
return
bit;
} catch (Exception e) {
file = null;
return
null;
}
}

H. android 圖片質量壓縮和尺寸壓縮有什麼區別

這個方法用來將特定格式的壓縮圖片寫入輸出流(OutputStream)中,當然例如輸出流與文件聯系在一起,壓縮後的圖片也就是一個文件。如果壓縮成功則返回true,其中有三個參數:

format是壓縮後的圖片的格式,可取值:Bitmap.CompressFormat .JPEG、~.PNG、~.WEBP。

quality的取值范圍為[0,100],值越小,經過壓縮後圖片失真越嚴重,當然圖片文件也會越小。(PNG格式的圖片會忽略這個值的設定)

stream指定壓縮的圖片輸出的地方,比如某文件。

上述方法還有一個值得注意的地方是:當用BitmapFactory decode文件時可能返回一個跟原圖片不同位深的圖片,或者丟失了每個像素的透明值(alpha),比如說,JPEG格式的圖片僅僅支持不透明的像素。文章android圖片壓縮在文末提到的下面這點可能就是這個原因:

當調用bitmap.compress(CompressFormat.JPEG, 100, fos);保存為圖片時發現圖片背景為黑色,如下圖:

下面是質量壓縮的代碼:

(Bitmapbmp,Filefile){

ByteArrayOutputStreambaos=newByteArrayOutputStream();

intoptions=80;//個人喜歡從80開始,

bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);

while(baos.toByteArray().length/1024>100){

baos.reset();

options-=10;

bmp.compress(Bitmap.CompressFormat.JPEG,options,baos);

}

try{

FileOutputStreamfos=newFileOutputStream(file);

fos.write(baos.toByteArray());

fos.flush();

fos.close();

}catch(Exceptione){

e.printStackTrace();

}

}

這段代碼來自Android圖片壓縮總結,我根據自己的需求改了改,但是大同小異,所以就直接貼了。

隨著代碼中的option逐漸變小,我們可以在logcat中列印baos的大小來查看圖片的大小。我們也可以去掉while的循環條件,一直壓縮下去看效果,最終一張照片可能就由原來的3、4M變成了幾百K甚至幾百B了。我在試的過程中將option設置成100,壓縮後偶爾會出現一張3、4M的圖片經過壓縮後竟變成了6、7M,這里還是有點困惑,不知道為什麼。

隨後,我想把這個壓縮後的圖片(1、200KB)填充到ImageView中時卻失敗了,logcat中提示圖片過大!這就是文章開頭提到的問題,雖然我們通過質量壓縮使File形式的圖片文件縮小了,但是並沒有改變圖片的寬高,原先是1080*1920解析度的圖片經壓縮後還是1080*1920,而File格式轉換成Bitmap格式進入到內存中時,內存是根據圖片的像素數量來給圖片分配內存大小的,還是有好幾M,因此填充ImageView失敗。

順便提一下,可以用bitmap.getByteCount()獲取存儲bitmap像素的內存大小,但是KITKAT(Android 4.4版本)以後用getAllocateByteCount()獲取。一般情況下,後者返回值比前者大,比如,當bitmap被重用去decode另外更小的bitmaps時,或者被人為地配置一下屬性值,比如setWidth()、setHeight()、reconfigure()時,如果bitmap不做以上操作,二者的返回值應該是一樣的。(譯文,不太懂)

二、尺寸壓縮

特點: 通過設置采樣率, 減少圖片的像素, 達到對內存中的Bitmap進行壓縮



我們主要通過BitmapFactory中的decodeFile方法對圖片進行尺寸壓縮:

publicstaticBitmapdecodeFile(StringpathName,BitmapFactory.Optionsopts)

public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)

其中有兩個參數:

pathName是圖片文件的路徑。

opts 就是所謂的采樣率,它里邊有很多屬性可以設置,我們通過設置屬性來達到根據自己的需要,壓縮出指定的圖片。其中比較常用的屬性有:

booleaninJustDecodeBounds—— 如果設置為true,則只讀取bitmap的寬高,而忽略內容。

intinSampleSize—— 如果>1,調用decodeFile方法後,就會得到一個更小的bitmap對象(已壓縮)。比如設置為2,那麼新Bitmap的寬高都會是原Bitmap寬高的1/2,總體大小自然就是原來的1/4了,以此類推。

booleaninPurgeable—— 如果設置為true,壓縮後的圖片像素占的內存將會在系統清理內存的時候被回收掉,當像素的信息再次被用到時將會自動重新decode該像素(比如getPixels()時)。(慎用!重復decode可以會造成UI的卡頓,API level 21 已棄用)

booleaninInputShareable—— 與inPurgeable配合使用,如果inPurgeable設置成false,自動忽略此值,如果inPurgeable為true,此值決定是否該bitmap能分享引用給輸入數據(inputstream,array等),或者必須進行深拷貝。API level 21 已棄用。(這是譯文,不太理解!!!)

下面是一段實現的代碼

privateBitmapsizeCompres(Stringpath,intrqsW,intrqsH){

//用option設置返回的bitmap對象的一些屬性參數

finalBitmapFactory.Optionsoptions=newBitmapFactory.Options();

options.inJustDecodeBounds=true;//設置僅讀取Bitmap的寬高而不讀取內容

BitmapFactory.decodeFile(path,options);//獲取到圖片的寬高,放在option里邊

finalintheight=options.outHeight;//圖片的高度放在option里的outHeight屬性中

finalintwidth=options.outWidth;

intinSampleSize=1;

if(rqsW==0||rqsH==0){

options.inSampleSize=1;

}elseif(height>rqsH||width>rqsW){

finalintheightRatio=Math.round((float)height/(float)rqsH);

finalintwidthRatio=Math.round((float)width/(float)rqsW);

inSampleSize=heightRatio<widthRatio?heightRatio:widthRatio;

options.inSampleSize=inSampleSize;

}

returnBitmapFactory.decodeFile(path,options);//主要通過option里的inSampleSize對原圖片進行按比例壓縮

}

private Bitmap sizeCompres(String path, int rqsW, int rqsH) {

// 用option設置返回的bitmap對象的一些屬性參數

final BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;// 設置僅讀取Bitmap的寬高而不讀取內容

BitmapFactory.decodeFile(path, options);// 獲取到圖片的寬高,放在option里邊

final int height = options.outHeight;//圖片的高度放在option里的outHeight屬性中

final int width = options.outWidth;

int inSampleSize = 1;

if (rqsW == 0 || rqsH == 0) {

options.inSampleSize = 1;

} else if (height > rqsH || width > rqsW) {

final int heightRatio = Math.round((float) height / (float) rqsH);

final int widthRatio = Math.round((float) width / (float) rqsW);

inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;

options.inSampleSize = inSampleSize;

}

return BitmapFactory.decodeFile(path, options);// 主要通過option里的inSampleSize對原圖片進行按比例壓縮

}

上面就是簡單的質量壓縮與尺寸壓縮。

I. 怎樣在安卓系統上壓縮圖片大小

安卓系統是手機系統,我們很少在手機上進行壓縮,有的手機是有壓縮功能的,想小米,oppo類的手機上有這種功能,壓縮效果並不樂觀,電腦上執行壓縮小編例舉了一下步驟:

a、打開任意瀏覽器,點擊瀏覽器的搜索框,在這里搜索圖片壓縮,選擇網頁搜索,我們要找到下載工具的網頁,將工具下載安裝到我們的電腦。

其實圖片文件壓縮是一個簡單的過程,但是我們要找對圖片文件壓縮的軟體,進行圖片壓縮就是一件簡單的事情

J. android開發,上傳圖片時,怎樣自動壓縮成800x600的尺寸求指教~~

protected Bitmap scaleImg(Bitmap bm, int newWidth, int newHeight) {
// 圖森螞纖片源
// Bitmap bm = BitmapFactory.decodeStream(getResources()
// .openRawResource(id));
// 獲得圖片的寬高
int width = bm.getWidth();
int height = bm.getHeight();
// 設置想要的物賀大小
int newWidth1 = newWidth;
int newHeight1 = newHeight;
// 計算縮放比此仿例
float scaleWidth = ((float) newWidth1) / width;
float scaleHeight = ((float) newHeight1) / height;
// 取得想要縮放的matrix參數
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
// 得到新的圖片
Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix,
true);
return newbm;

}
你可以試下,如果不行,建議你還是先壓縮在上傳。

熱點內容
安川編程招工 發布:2024-04-30 15:21:31 瀏覽:641
lru缺頁演算法 發布:2024-04-30 15:19:29 瀏覽:496
伺服器內網ip和外網ip是什麼 發布:2024-04-30 15:13:13 瀏覽:752
c編譯的產物 發布:2024-04-30 15:07:07 瀏覽:58
sql2000服務 發布:2024-04-30 15:00:05 瀏覽:530
如何導出土豆緩存視頻 發布:2024-04-30 14:39:36 瀏覽:470
圖論環的演算法 發布:2024-04-30 14:39:35 瀏覽:641
演算法課項目 發布:2024-04-30 14:23:34 瀏覽:245
路由器無線密碼從哪裡看 發布:2024-04-30 13:41:07 瀏覽:765
安卓由哪個公司提供 發布:2024-04-30 12:27:03 瀏覽:417