从媒体数据库读取图片文件并剪切。
选择图片如下:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE);
获得的数据如下:
Uri uri = intent.getData();
剪切图片如下:
private String mOutputPath = "/mnt/sdcard/Android/data/xxx.jpg";
private void startSketchCrop(){
Intent intent = new Intent();
intent.setDataAndType(mUri, "image/*"); //指定傳入的uri和type
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setAction("com.android.camera.action.CROP");
intent.putExtra("aspectX", 1); //指定裁剪工具中的1:1比例
intent.putExtra("aspectY", 1);
intent.putExtra("noFaceDetection", true); // 取消臉部偵測
intent.putExtra("output", Uri.fromFile(new File(mOutputPath))); //指定輸出結果的檔案路徑
startActivityForResult(intent, REQUEST_CROP);
}
获得数据如下:
String savedPath = intent.getStringExtra("filePath"); //回傳輸出結果的檔案路徑
获得图片后,显示在View上时,需要按比例填充,代码如下:
public static Bitmap resizeToFixScreen(Bitmap bmp, int screenWidth, int screenHeight)
{
if (bmp == null)
return null;
Log.d(TAG, " resizeToFixScreen ");
Bitmap resizeBitmap = null;
int[] newBmpSize = countImageNewSize(bmp.getWidth(), bmp.getHeight(), screenWidth, screenHeight);
if (newBmpSize != null && newBmpSize.length > 1)
{
float scaleWidth = (float) newBmpSize[0] / bmp.getWidth();
float scaleHeight = (float) newBmpSize[1] / bmp.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
try
{
resizeBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
}
catch (Exception e)
{
Log.d(TAG, " loadImage got exception " + e);
e.printStackTrace();
}
if (bmp != resizeBitmap && !bmp.isRecycled())
{
bmp.recycle();
bmp = null;
}
}
return resizeBitmap;
}
private static int[] countImageNewSize(int inputW, int inputH, int windowW, int windowH)
{
int outW = windowW;
int outH = windowH;
Log.d(TAG, " countIamgeNewSize windowSize = " + outW + " X " + outH);
float widthRatio = (float)inputW / (float)windowW;
float heightRatio = (float)inputH / (float)windowH;
if (widthRatio <= 1 && heightRatio <= 1)
{
Log.d(TAG, " countImageNewSize case 1");
outW = inputW;
outH = inputH;
}
else
{
Log.d(TAG, " countImageNewSize case 2, need to re-compute size");
if (widthRatio > heightRatio)
{
outH = Math.round(inputH/widthRatio);
}
else
{
outW = Math.round(inputW/heightRatio);
}
}
Log.d(TAG, "countImageNewSize outSize = " + outW + " X " + outH);
return new int[]{outW, outH};
}