Android 세 가지 흔 한 그림 압축 방식
먼저 데이터 한 세트 를 드 리 겠 습 니 다.
원본 그림:width:2976;height:2976
원 도 실제:---byte:2299820 Mb:2.19328
질량 압축 size---:byte:1599831 kb:1562.33496
비례 압축 size---:byte:191707 kb:187.21387
노반 압축 size--->:byte:143792 kb:140.42188
압축 효과:노반 압축>비례 압축>품질 압축
1.품질 압축
public void getBitmap(String imgPath, String outPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = false;
newOpts.inPurgeable = true;
newOpts.inInputShareable = true;
// Do not compress
newOpts.inSampleSize = 1;
newOpts.inPreferredConfig = Config.RGB_565;
storeImage(bitmap, outPath); //
}
주의 하 다.4.567917.품질 압축 은 그림 의 픽 셀 을 감소 시 키 지 않 는 다.이것 은 픽 셀 을 유지 하 는 전제 에서 그림 의 깊이 와 투명 도 를 바 꾸 는 등 그림 을 압축 하 는 목적 을 달성 하 는 것 이다.이것 이 바로 이 방법 을 품질 압축 방법 이 라 고 부 르 는 이유 이다.그래서 이런 방법 은 그림 의 크기 를 줄 이지 않 을 가능성 이 높다.
/**
* bitmap
*
* @param bitmap
* @param outPath
* @throws FileNotFoundException
*/
public static boolean storeImage(Bitmap bitmap, String outPath) throws FileNotFoundException {
FileOutputStream os = new FileOutputStream(outPath);
boolean compressResult = bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
return compressResult;
}
2.비례 압축(사이즈 압축,샘플링 율 압축)
/**
*
*
* @param path
* @param targetW
* @param targetH
* @return
*/
public static String compressScale(String path,, String outPath, int targetW, int targetH) throws FileNotFoundException {
// option
BitmapFactory.Options options = new BitmapFactory.Options();
// inJustDecodeBounds true, option decode Bitmap null,
// option
options.inJustDecodeBounds = true;
// bitmap null
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
int inSampleSize = 1; // 1
//
int inSampleSizeW = options.outWidth / targetW;
int inSampleSizeH = options.outHeight / targetH;
// , , 3 ,
// , ,
if (inSampleSizeW > inSampleSizeH) {
inSampleSize = inSampleSizeW;
} else {
inSampleSize = inSampleSizeH;
}
// inJustDecodeBounds false, Bitmap null
options.inJustDecodeBounds = false;
// ( )
options.inSampleSize = inSampleSize;
bitmap = BitmapFactory.decodeFile(path, options);
boolean isSuccess = storeImage(bitmap, outPath);
if (isSuccess) {
return outPath;
}
return "";
}
이 방법 은 그림 의 샘플링 율 을 설정 하여 그림 픽 셀 을 낮 추고 그림 픽 셀 의 크기 를 줄 이 는 것 이다.그렇다면 나 는 어떻게 그림 압축 전후의 크기 를 얻 었 을 까?
메모:이 그림 의 크기 는 그림 의 실제 크기 를 말 합 니 다.bitmap 가 메모리 에서 차지 하 는 크기 가 아니 라 압축 효 과 를 보면 그림 이 파일 에서 차지 하 는 크기 를 봐 야 합 니 다.
/**
*
*
* @param imgPath
* @return , byte
*/
public static int getFileSize(String imgPath) {
int size = 0;
try {
FileInputStream fis = new FileInputStream(new File(imgPath));
size = fis.available();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return size;
}
3.노반 압축(추천)노반 압축 은 하나의 알고리즘 에 따라 얻어 진 것 으로 압축 효 과 는 기본적으로 위 챗 과 일치 하 며 차이 가 많 지 않 고 200 k 이내 이 며 그림 은 진실 을 잃 지 않 는 다.
노반 압축:
https://github.com/Curzibn/Luban
build.gradle 의존 도 추가
compile 'top.zibin:Luban:1.1.3'
private void lunBanPress(String path) {
String pressPath = Environment.getExternalStorageDirectory().getPath();
Luban.with(this)
.load(path) //
.ignoreBy(100) //
.setTargetDir(pressPath) //
.setCompressListener(new OnCompressListener() { //
@Override
public void onStart() {
// TODO , loading UI
Log.i(TAG, "onStart: ");
}
@Override
public void onSuccess(File file) {
// TODO ,
Glide.with(activity).load(file).into(iv2);
Log.i(TAG, "onSuccess: :");
try {
int size = new FileInputStream(file).available();
Log.i("tag", " size--->:" + "byte:" + size + " kb:"
+ (float) size / 1024);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
// TODO
Log.i(TAG, "onError: ");
}
}).launch(); //
}
원본 주소:https://github.com/zhouxu88/ImgCompress
여기 서 끝 이 야~
이상 은 안 드 로 이 드 세 가지 흔히 볼 수 있 는 이미지 압축 방식 의 상세 한 내용 입 니 다.안 드 로 이 드 이미지 압축 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.