package com.hpw.myapp.widget.imageselector.view; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.net.Uri; import android.opengl.GLES10; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.TextView; import com.hpw.mvpframe.base.CoreBaseActivity; import com.hpw.myapp.R; import com.hpw.myapp.widget.imageselector.utils.CropUtil; import com.hpw.myapp.widget.imageselector.utils.FileUtils; import com.isseiaoki.simplecropview.CropImageView; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ImageCropActivity extends CoreBaseActivity { public static final String EXTRA_PATH = "extraPath"; public static final String OUTPUT_PATH = "outputPath"; public static final int REQUEST_CROP = 69; private static final int SIZE_DEFAULT = 2048; private static final int SIZE_LIMIT = 4096; private Toolbar toolbar; private TextView doneText; private CropImageView cropImageView; private Uri sourceUri; private Uri saveUri; private final Handler handler = new Handler(); public static void startCrop(Activity activity, String path) { Intent intent = new Intent(activity, ImageCropActivity.class); intent.putExtra(EXTRA_PATH, path); activity.startActivityForResult(intent, REQUEST_CROP); } @Override public int getLayoutId() { return R.layout.activity_image_crop; } @Override public void initView(Bundle savedInstanceState) { String path = getIntent().getStringExtra(EXTRA_PATH); sourceUri = Uri.fromFile(new File(path)); initView(); registerListener(); } public void initView() { toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle(""); setSupportActionBar(toolbar); toolbar.setNavigationIcon(R.mipmap.ic_back); doneText = (TextView) findViewById(R.id.done_text); cropImageView = (CropImageView) findViewById(R.id.cropImageView); cropImageView.setHandleSizeInDp(10); int exifRotation = CropUtil.getExifRotation(CropUtil.getFromMediaUri(this, getContentResolver(), sourceUri)); InputStream is = null; try { int sampleSize = calculateBitmapSampleSize(sourceUri); is = getContentResolver().openInputStream(sourceUri); BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = sampleSize; Bitmap sizeBitmap = BitmapFactory.decodeStream(is, null, option); if (sizeBitmap == null) return; Matrix matrix = getRotateMatrix(sizeBitmap, exifRotation % 360); Bitmap rotated = Bitmap.createBitmap(sizeBitmap, 0, 0, sizeBitmap.getWidth(), sizeBitmap.getHeight(), matrix, true); cropImageView.setImageBitmap(rotated); } catch (IOException e) { e.printStackTrace(); } catch (OutOfMemoryError e) { e.printStackTrace(); } finally { CropUtil.closeSilently(is); } } public void registerListener() { toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); doneText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ProgressDialog.show( ImageCropActivity.this, null, getString(R.string.save_ing), true, false); saveUri = Uri.fromFile(FileUtils.createCropFile(ImageCropActivity.this)); saveOutput(cropImageView.getCroppedBitmap()); } }); } public Matrix getRotateMatrix(Bitmap bitmap, int rotation) { Matrix matrix = new Matrix(); if (bitmap != null && rotation != 0) { int cx = bitmap.getWidth() / 2; int cy = bitmap.getHeight() / 2; matrix.preTranslate(-cx, -cy); matrix.postRotate(rotation); matrix.postTranslate(bitmap.getWidth() / 2, bitmap.getHeight() / 2); } return matrix; } private int calculateBitmapSampleSize(Uri bitmapUri) throws IOException { InputStream is = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; try { is = getContentResolver().openInputStream(bitmapUri); BitmapFactory.decodeStream(is, null, options); // Just get image size } finally { CropUtil.closeSilently(is); } int maxSize = getMaxImageSize(); int sampleSize = 1; while (options.outHeight / sampleSize > maxSize || options.outWidth / sampleSize > maxSize) { sampleSize = sampleSize << 1; } return sampleSize; } private int getMaxImageSize() { int textureLimit = getMaxTextureSize(); if (textureLimit == 0) { return SIZE_DEFAULT; } else { return Math.min(textureLimit, SIZE_LIMIT); } } private int getMaxTextureSize() { int[] maxSize = new int[1]; GLES10.glGetIntegerv(GLES10.GL_MAX_TEXTURE_SIZE, maxSize, 0); return maxSize[0]; } private void saveOutput(Bitmap croppedImage) { if (saveUri != null) { OutputStream outputStream = null; try { outputStream = getContentResolver().openOutputStream(saveUri); if (outputStream != null) { croppedImage.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); } } catch (IOException e) { e.printStackTrace(); } finally { CropUtil.closeSilently(outputStream); } setResult(RESULT_OK, new Intent().putExtra(OUTPUT_PATH, saveUri.getPath())); } final Bitmap b = croppedImage; handler.post(new Runnable() { public void run() { b.recycle(); } }); finish(); } }