android图片裁剪 自由,Android图片裁剪之自由裁剪

客户的需求都是非常怪的。我有时候在给客户做项目的时候就想骂客户是sb。可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的哥哥肯定也会骂你是sb。

是这种,客户须要做一个图片上传的功能,这个图片须要裁剪。一般而言,这东西用系统自带的裁剪就搞定了。但是客户不,他要能够自由裁剪,就是长宽比不固定,想裁成什么比例就裁成什么比例,我一听,蛋都碎了。

没有办法,客户sb归sb,需求还是得照做,不然不给钱要喝西北风了。

图片裁剪的功能系统自带了,和我的需求仅仅有一点不一样,就是它是固定宽高比的,设定了宽高比就不能再改变,而我须要自由宽高比。好吧,既然仅仅有这一点不一样,那给他改改即可了。

事实上我这人是非常懒的,我早就想谷歌一下看有没有人写好的,拿来改下直接用好了。但是找了一圈,仅仅有一个哥哥自己写了一个自己定义裁剪的功能。跑了一下,基本功能能够实现,但是太Ugly了,并且不太稳定,有一些适配没有做好。想想还是自己改源代码好了,嗯,就这样。

下载gallery的源代码,抽取裁剪功能的代码,如图

3da5c1d618e18ff3cbd0f215caa26c13.png

这基本就好了,然后CropImage.java里面有叉叉,自己改下就好了。这个类使用了View里面的一些变量,这些变量被打上了hide标签,所以sdk应用开发是看不到,仅仅有系统编译才干够通过。这里面有非常多东西我们是不须要的,比方/*if (extras != null) {

if (extras.getString("circleCrop") != null) {

mCircleCrop = true;

mAspectX = 1;

mAspectY = 1;

}

mSaveUri = (Uri) extras.getParcelable(MediaStore.EXTRA_OUTPUT);

if (mSaveUri != null) {

String outputFormatString = extras.getString("outputFormat");

if (outputFormatString != null) {

mOutputFormat = Bitmap.CompressFormat.valueOf(

outputFormatString);

}

} else {

mSetWallpaper = extras.getBoolean("setWallpaper");

}

mBitmap = (Bitmap) extras.getParcelable("data");

mAspectX = extras.getInt("aspectX");

mAspectY = extras.getInt("aspectY");

mOutputX = extras.getInt("outputX");

mOutputY = extras.getInt("outputY");

mScale = extras.getBoolean("scale", true);

mScaleUp = extras.getBoolean("scaleUpIfNeeded", true);

mDoFaceDetection = extras.containsKey("noFaceDetection")

? !extras.getBoolean("noFaceDetection")

: true;

}

if (mBitmap == null) {

Uri target = intent.getData();

// mAllImages = ImageManager.makeImageList(mContentResolver, target,

// ImageManager.SORT_ASCENDING);

mImage = mAllImages.getImageForUri(target);

if (mImage != null) {

// Don't read in really large bitmaps. Use the (big) thumbnail

// instead.

// TODO when saving the resulting bitmap use the

// decode/crop/encode api so we don't lose any resolution.

mBitmap = mImage.thumbBitmap(IImage.ROTATE_AS_NEEDED);

}

}*/看这里凝视掉的代码,就是你调用系统裁剪的时候要传的一些參数,我这里直接凝视掉,仅仅传一个要剪切图片的uri就能够。

然后怎么让他自由裁剪呢,看下mAspectX变量的使用,源代码里面用mAspectX和mAspectY来做宽高比计算的,我们就把他计算宽高比的地方凝视掉就好了。把mAspectX和mAspectY都设为1,然后改动几个地方:

hv.setup(mImageMatrix, imageRect, faceRect, mCircleCrop,false

/*mAspectX != 0 && mAspectY != 0*/);这里凝视掉了最后一个条件,直接传false,就会取消宽高比限制。

if (mAspectX != 0 && mAspectY != 0) {

if (mAspectX > mAspectY) {

// 自由缩放

cropHeight = cropWidth * mAspectY ;// mAspectX;

} else {

cropWidth = cropHeight * mAspectX ;// mAspectY;

}

}这里去掉了宽高比计算。

然后基本就完毕了。

d3433250ded0a0eb4f70499b7dc58ac2.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Android图片裁剪的示例代码: ```java // 引用[1] // 在AndroidManifest.xml文件中添加权限 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> // 在Activity中调用图片裁剪功能 private static final int REQUEST_CODE_PICK_IMAGE = 1; private static final int REQUEST_CODE_CROP_IMAGE = 2; private Uri mImageUri; // 启动图片选择器 private void pickImage() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE); } // 处理图片选择结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK) { mImageUri = data.getData(); cropImage(); } else if (requestCode == REQUEST_CODE_CROP_IMAGE && resultCode == RESULT_OK) { // 处理裁剪后的图片 Bitmap bitmap = BitmapFactory.decodeFile(mImageUri.getPath()); // 显示裁剪后的图片 imageView.setImageBitmap(bitmap); } } // 启动图片裁剪 private void cropImage() { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageUri, "image/*"); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); intent.putExtra("outputX", 200); intent.putExtra("outputY", 200); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(intent, REQUEST_CODE_CROP_IMAGE); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值