用ACEDSS 調整大小。就OK
『貳』 android 圖片質量壓縮和尺寸壓縮
不會的。因為質量壓縮並不是能一味的壓縮下去,壓縮到一定程度就不會再壓縮了,它只是通過改變色深等改變圖片大小,不會改變其佔用的內存
『叄』 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對原圖片進行按比例壓縮
}
上面就是簡單的質量壓縮與尺寸壓縮。
『肆』 android 圖片壓縮
有壓縮軟體。手機壓縮軟體。你網路
下載就可以了。
『伍』 android開發 圖片很多 想全部打包壓縮後放到assets下,請教怎樣才能獲取裡面的圖片
java">法一:Stringpath="file:///android_asset/文件名";
法二:InputStreaminputStream=getClass().getResourceAsStream("/assets/文件名");
『陸』 android中壓縮圖片的幾種方法比較
圖片有三種存在形式:硬碟上時是file,網路傳輸時是stream,內存中是stream或bitmap,所謂的質量壓縮,它其實只能實現對 file的影響,你可以把一個file轉成bitmap再轉成file,或者直接將一個bitmap轉成file時,這個最終的file是被壓縮過的,但 是中間的bitmap並沒有被壓縮(或者說幾乎沒有被壓縮,我不確定),因為bigmap在內存中的大小是按像素計算的,也就是width * height,對於質量壓縮,並不會改變圖片的像素,所以就算質量被壓縮了,但是bitmap在內存的佔有率還是沒變小,但你做成file時,它確實變小 了;
而尺寸壓縮由於是減小了圖片的像素,所以它直接對bitmap產生了影響,當然最終的file也是相對的變小了;
『柒』 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;
}
}
『捌』 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 中如何壓縮圖片
1:ByteArrayOutputStream 壓縮圖片質量,不會改變圖片大小
privateBitmapcompressImage(Bitmapimage){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,baos);//質量壓縮方法,這里100表示不壓縮,把壓縮後的數據存放到baos中
intoptions=100;while(baos.toByteArray().length/1024>100){//循環判斷如果壓縮後圖片是否大於100kb,大於繼續壓縮
baos.reset();//重置baos即清空baos
image.compress(Bitmap.CompressFormat.JPEG,options,baos);//這里壓縮options%,把壓縮後的數據存放到baos中
options-=10;//每次都減少10}
ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());//把壓縮後的數據baos存放到ByteArrayInputStream中
Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);//把ByteArrayInputStream數據生成圖片
returnbitmap;
}
2:就是改變圖片大小
privateBitmapgetimage(StringsrcPath){
BitmapFactory.OptionsnewOpts=newBitmapFactory.Options();//開始讀入圖片,此時把options.inJustDecodeBounds設回true了
newOpts.inJustDecodeBounds=true;
Bitmapbitmap=BitmapFactory.decodeFile(srcPath,newOpts);//此時返回bm為空
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;//設置縮放比例//重新讀入圖片,注意此時已經把options.inJustDecodeBounds設回false了
bitmap=BitmapFactory.decodeFile(srcPath,newOpts);returncompressImage(bitmap);//壓縮好比例大小後再進行質量壓縮}
『拾』 android 圖片壓縮,網上的都是對單個圖片進行壓縮,如果我想一次性對這個圖片文件夾進行壓縮
沒弄過,但無非就是文件夾遍歷加上單圖片壓縮,你搜索一下android 文件夾遍歷就可以找到代碼。