Android图片裁剪之自由裁剪

Android图片裁剪之自由裁剪

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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

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


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


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


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


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


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

Android图片裁剪之自由裁剪

这基本就好了,然后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;
                }
            }

这里去掉了宽高比计算。

然后基本就完毕了。

Android图片裁剪之自由裁剪

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118557.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python flask教程_python框架有哪些

    python flask教程_python框架有哪些大家好,这算是我使用CSDN以来第一次正二八经的想自己写一篇博客。如果有写的不好的地方还请大家见谅!使用pipenv的方便之处就是可以单独的为每一个python 项目建立对应的虚拟环境,而且该过程简单方便。下面我会用简短的步骤来描述这个过程:1. 首先使用pip进行安装pipenv。 用管理员身份打开命令行(cmd),然后输入pipinstallpipenv 回车,结果如下图所…

  • noip2018提高组初赛解析_noip小学组

    noip2018提高组初赛解析_noip小学组【问题简述】给定一个数n表示教室数接下来n个数r[i],表示每天可以借用的教室数量。有m份订单,每份订单有三个数d[i],s[i],t[i]。表示从S[i]天到t[i]天,借用d[i]个教室。现在询问能否满足所有订单。如果能,则输出0不能,则输出-1,换行输出最早不能满足的订单。【输入样例】432543213324424…

  • python图像轮廓识别_python数字图像处理

    python图像轮廓识别_python数字图像处理前面一篇文章介绍了图像分类知识,包括常见的图像分类算法,并介绍Python环境下的贝叶斯图像分类算法、基于KNN算法的图像分类和基于神经网络算法的图像分类等案例。这篇文章将详细讲解图像分割知识,包括阈值分割、边缘分割、纹理分割、分水岭算法、K-Means分割、漫水填充分割、区域定位等。万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。当然如果您是在读学生或经济拮据,可以私聊我给你每篇文章开白名单,或者转发原文给你,更希望您能进步

  • plsqldeveloper汉化包_plsql汉化包

    plsqldeveloper汉化包_plsql汉化包PLSQLDeveloper汉化补丁下载地址http://download.csdn.net/download/rxtanlian/10141249一、双击运行补丁二、选择你PLSQLDeveloper的安装目录看图三、点击蓝色三角形按钮四、继续下一步五、下一步,完成汉化六、完成七、重启你的PLSQLDeveloper效果就出来了,哈哈

    2022年10月12日
  • 汇编指令之移位指令[通俗易懂]

    汇编指令之移位指令[通俗易懂]   移位指令包括了算术移位指令、逻辑移位指令、循环移位指令。    格式为:xxxoper1,CL/1       ;移位次数只能是1或者存放在CL里面。一、算术移位指令1、算术左移指令SAL功能:左移一次,最低位补0,最高位送入CF标志位,如图:意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。2、算术右移指令SAR功能:右移一次,最高位保持不变,最低位送入…

  • 二进制减法的简单过程

    二进制减法的简单过程二进制减法的运算方法二进制减法有两种运算方法,可以使用向高位借位的办法,也可以将减法转为加法采用借位的办法不是很快捷,比较容易看错,示例如下:1010-0111————0011被减数末尾的0向前一位借1,相当于10(2)-1得到1,倒数第二位被借一位后变0,继续向前一位借,以此来得到结果,如果减数大于被减数,则需将最后的结果按位取反得到结果。另外也可采用转换为加法…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号