当前位置: 代码迷 >> Android >> Android图片裁剪之自由剪裁
  详细解决方案

Android图片裁剪之自由剪裁

热度:35   发布时间:2016-04-28 05:23:15.0
Android图片裁剪之自由裁剪

我的博客http://blog.csdn.net/dawn_moon


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


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


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


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


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


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


这基本就好了,然后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;                }            }
这里去掉了宽高比计算。

然后基本就完成了。




  相关解决方案