• 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;
                    }
                }
    这里去掉了宽高比计算。

    然后基本就完毕了。




  • 相关阅读:
    LamBda学习(一)
    如何返回一个只读泛型集合
    Socket编程笔记同步
    如何快速读取大文件(看csdn一网友要求写的)没有测试具体的速度。
    如何实现项目脚本的批量生成
    如何实现WORD查找完成后不提示的代码
    W32/Pate.a 病毒处理小记
    在WORD中用VBA实现光标移动与内容选择
    2. WCF 消息操作
    3. WCF 异常处理
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3939982.html
Copyright © 2020-2023  润新知