Android 이미지 압축 예제 코드 구현

9200 단어 Android그림 압축
핵심 사상 은 BitmapFactory.Options 를 통 해 그림 의 크기 를 조정 하 는 것 입 니 다.주로 inSampleSize 인자(샘플링 율)를 사 용 했 습 니 다.
inSampleSize 가 1 일 때 샘플링 한 그림 의 크기 는 그림 의 원본 크기 입 니 다.
inSampleSize 가 2 일 때 샘플링 후의 그림 의 너비 와 높이 는 원래 의 1/2 이다.즉,픽 셀 점 은 원래 의 1/4 이 고 메모리 가 원래 의 1/4 를 차지 하 는 것 이다.이런 식 으로 유추 하 다.
inSampleSize 가 1 보다 작 을 때 효 과 는 1 과 같 습 니 다.
압축 프로 세 스 는 다음 과 같 습 니 다.
1.BitmapFactory.Options 의 inJustDecodeBounds 매개 변 수 는 true 로 설정 되 어 있 습 니 다.
2.BitmapFactory.Options 에서 그림 의 원래 너비,outWidth,outHeight 를 추출 합 니 다.
3.자신의 필요 에 따라 적당 한 샘플링 율 을 설정 합 니 다.
4.BitmapFactory.Options 의 inJustDecodeBounds 인 자 를 false 로 설정 한 다음 그림 을 불 러 올 수 있 습 니 다.
다음은 코드 를 보 겠 습 니 다.

public Bitmap decodeSampledBitmapFromBytes(byte[] bytes,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
  }


public int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){
    if(reqWidth == 0 || reqHeight == 0){
      return 1;
    }
    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;
    if( width > reqWidth || height > reqHeight){
      final int halfWidth = width / 2;
      final int halfHeight = height / 2;
      while ((halfWidth / inSampleSize) >= reqWidth && (halfHeight / inSampleSize) >= reqHeight){
        inSampleSize *=2;
      }
    }
    return inSampleSize;
  }

이렇게 되면 그림 한 장의 압축 이 완성 된다.또한 BitmapFactory 는 다른 decode 방법 도 있 습 니 다.우 리 는 위 에 있 는 것 을 본 떠 서 쓸 수 있 습 니 다.

public Bitmap decodeSampledBitmapFromResource(Resources res,int resId,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res,resId,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res,resId,options);
  }

public Bitmap decodeSampledBitmapFromDescrptor(FileDescriptor fd,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFileDescriptor(fd,null,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFileDescriptor(fd,null,options);
  }
다음은 작은 데모 와 결합 하여 완전한 절 차 를 실현 합 니 다.
먼저 그림 압축 류 를 밀봉 하 다.

public class ImageResizer {
  private static final String TAG = "ImageResizer";

  public ImageResizer(){}

  public Bitmap decodeSampledBitmapFromResource(Resources res,int resId,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res,resId,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res,resId,options);
  }

  public Bitmap decodeSampledBitmapFromBytes(byte[] bytes,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    Bitmap a = BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    Log.d(TAG, "before bitmap : " + a.getRowBytes() * a.getHeight());
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    Bitmap b = BitmapFactory.decodeByteArray(bytes,0,bytes.length,options);
    Log.d(TAG, "after bitmap : " + b.getRowBytes() * b.getHeight());
    return b;
  }

  public Bitmap decodeSampledBitmapFromDescrptor(FileDescriptor fd,int reqWidth,int reqHeight){
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFileDescriptor(fd,null,options);
    options.inSampleSize = calculateInSampleSize(options,reqWidth,reqHeight);
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFileDescriptor(fd,null,options);
  }

  public int calculateInSampleSize(BitmapFactory.Options options,int reqWidth,int reqHeight){
    if(reqWidth == 0 || reqHeight == 0){
      return 1;
    }
    final int width = options.outWidth;
    final int height = options.outHeight;
    int inSampleSize = 1;
    if( width > reqWidth || height > reqHeight){
      final int halfWidth = width / 2;
      final int halfHeight = height / 2;
      while ((halfWidth / inSampleSize) >= reqWidth && (halfHeight / inSampleSize) >= reqHeight){
        inSampleSize *=2;
      }
    }
    return inSampleSize;
  }
}

그리고 가 져 와 서 사용 할 수 있 습 니 다.
activity_main2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main2"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context="com.example.yuan.test.Main2Activity">

  <ImageView
    android:id="@+id/main2Iv"
    android:layout_width="200dp"
    android:layout_height="200dp" />

</RelativeLayout>

Main2Activity.Java

public class Main2Activity extends AppCompatActivity {

  private ImageView iv;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    initView();
    testHttp(iv);
  }

  private void testHttp(final ImageView iv) {

    new Thread(new Runnable() {
      @Override
      public void run() {
        String urlString = "https://static.pexels.com/photos/295818/pexels-photo-295818.jpeg";
        HttpURLConnection urlConnection = null;
        InputStream in = null;
        ByteArrayOutputStream outStream = null;
        try {
          URL url = new URL(urlString);
          urlConnection = (HttpURLConnection) url.openConnection();
          in = urlConnection.getInputStream();
          byte[] buffer = new byte[1024];
          int len;
          outStream = new ByteArrayOutputStream();
          while ((len = in.read(buffer)) != -1){
            outStream.write(buffer,0,len);
          }
          final byte[] data = outStream.toByteArray();
          runOnUiThread(new Runnable() {
            @Override
            public void run() { //      UI
              iv.setImageBitmap(new ImageResizer().decodeSampledBitmapFromBytes(data,200,200));
            }
          });
        } catch (IOException e) {
          e.printStackTrace();
        }finally {
          try {
            if(urlConnection !=null){
              urlConnection.disconnect();
            }
            if(in != null){
              in.close();
            }
            if(outStream != null){
              outStream.close();
            }
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }).start();
  }

  private void initView() {
    iv = (ImageView) findViewById(R.id.main2Iv);
  }
}

마지막 으로 네트워크 권한 가 져 오기
실행 결과:
압축 전후의 bitmap 크기 대비
压缩前后的bitmap大小对比
압축 전후의 bitmap 크기 대비
这里写图片描述  
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기