选择图片剪切功能

从媒体数据库读取图片文件并剪切。
选择图片如下:

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};
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值