1.BitmapFactory
2.圖片存在的形式
3.圖片壓縮方式
- 質(zhì)量壓縮
- 尺寸壓縮
- 采樣率壓縮
1.圖片工具類:BitmapFactory
BitmapFactory.Options:參數(shù):
inDensity:bitmap的像素密度
inTargetDensity:bitmap最終的像素密度
DensityDpi(屏幕的像素密度) | 分辨率 | Density |
---|---|---|
160dpi | 320x533 | 1 |
px = dp*Density
手機(jī)像素表.png
2.圖片存在的幾種形式:
- File
- 流的形式
- Bitmap的形式(也是內(nèi)存形式)
BitmapFactory.decodeFile(pathName)
BitmapFactory.decodeResource(res, id)
BitmapFactory.decodeStream(is)
3.圖片壓縮方式(Bitmap壓縮)
最終調(diào)用了Bitmap的壓縮算法實(shí)現(xiàn)的
3.1.質(zhì)量壓縮
原理:
通過(guò)算法摳掉(同化)了圖片中的一些某個(gè)些點(diǎn)附近相近的像素,達(dá)到降低質(zhì)量介紹文件大小的目的梯刚。減小了圖片質(zhì)量梦抢,縮小文件大小姐帚。
AB
CD
壓縮后
AA
AA
注意:
它其實(shí)只能實(shí)現(xiàn)對(duì)file的影響嗅定,對(duì)加載這個(gè)圖片出來(lái)的bitmap內(nèi)存是無(wú)法節(jié)省的赂弓,還是那么大到腥。因?yàn)閎itmap在內(nèi)存中的大小是按照像素計(jì)算的梧田,也就是width*height雁比,對(duì)于質(zhì)量壓縮稚虎,并不會(huì)改變圖片的真實(shí)的像素(像素大小不會(huì)變)。
使用場(chǎng)景:
將圖片壓縮后保存到本地偎捎,或者將圖片上傳到服務(wù)器蠢终。根據(jù)實(shí)際需求來(lái)。
public void qualitCompress(View v){
BitmapFactory.Options options = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
//壓縮圖片
compressImageToFile(bitmap, new File(sdFile,"qualityCompress.jpeg"));
}
/**
* 1. 質(zhì)量壓縮
設(shè)置bitmap options屬性茴她,降低圖片的質(zhì)量寻拂,像素不會(huì)減少
第一個(gè)參數(shù)為需要壓縮的bitmap圖片對(duì)象,第二個(gè)參數(shù)為壓縮后圖片保存的位置
設(shè)置options 屬性0-100丈牢,來(lái)實(shí)現(xiàn)壓縮
* @param bmp
* @param file
*/
public static void compressImageToFile(Bitmap bmp,File file) {
// 0-100 100為不壓縮
int options = 20;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮后的數(shù)據(jù)存放到baos中
bmp.compress(Bitmap.CompressFormat.JPEG, options, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3.2.尺寸壓縮
原理:
通過(guò)減少單位尺寸的像素值祭钉,正真意義上的降低像素。1020*8880--
使用場(chǎng)景:
緩存縮略圖的時(shí)候(頭像處理)
public static void compressBitmapToFileBySize(Bitmap bmp,File file){
//壓縮尺寸倍數(shù)己沛,值越大慌核,圖片的尺寸就越小
int ratio = 4;
//壓縮Bitmap到對(duì)應(yīng)尺寸
Bitmap result = Bitmap.createBitmap(bmp.getWidth()/ratio, bmp.getHeight()/ratio, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
RectF rect = new RectF(0, 0, bmp.getWidth()/ratio, bmp.getHeight()/ratio);
canvas.drawBitmap(bmp, null, rect , null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//把壓縮后的數(shù)據(jù)存放到baos中
result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
3.3采樣率壓縮
設(shè)置圖片的采樣率,降低圖片像素申尼,也是正真意義上的降低像素
通過(guò)設(shè)置采樣率遂铡,加載在內(nèi)存中的時(shí)候就已經(jīng)壓縮了
/**
* 設(shè)置圖片的采樣率,降低圖片像素
* @param filePath
* @param file
*/
public static void compressBitmap(String filePath, File file){
// 數(shù)值越高晶姊,圖片像素越低
int inSampleSize = 8;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
//options.inJustDecodeBounds = true;//為true的時(shí)候不會(huì)真正加載圖片扒接,而是得到圖片的寬高信息。
//采樣率,必須是2的倍數(shù)
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 把壓縮后的數(shù)據(jù)存放到baos中
bitmap.compress(Bitmap.CompressFormat.JPEG, 100 ,baos);
try {
if(file.exists())
{
file.delete();
}
else {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(baos.toByteArray());
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}