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图片裁剪之自由裁剪

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

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

(0)
上一篇 2021年12月4日 下午3:00
下一篇 2021年12月4日 下午3:00


相关推荐

  • 世界著名厂家单片机简介

    世界著名厂家单片机简介1 Motorola 单片机 nbsp nbsp nbsp nbsp Motorola 是世界上最大的单片机厂商 品种全 选择余地大 新产品多 在 8 位机方面有 68HC05 和升级产品 68HC08 68HC05 有 30 多个系列 200 多个品种 产量超过 20 亿片 8 位增强型单片机 68HC11 也有 30 多个品种 年产量 1 亿片以上 升级产品有 68HC12 16 位单片机 68HC16 也有十多个品种 32 位单片机 683XX 系列也有几十个品种

    2026年3月26日
    2
  • HTML和JSP区别

    HTML和JSP区别1 HTML HypertextMar 文本标记语言 它是静态页面 浏览器可以直接打开 JSP JavaServerPa 看这个意思就知道是 Java 服务端的页面 所以它是动态的 它是需要经过 JDK 编译后把内容发给客户端去显示 2 他们的表头不同 这个是 JSP 的头 lt pagelanguage java import java util

    2025年6月3日
    6
  • 阿里的笔试题_阿里巴巴java笔试题

    阿里的笔试题_阿里巴巴java笔试题2015阿里笔试题阿里2015招聘实习生笔试题笔试最后一题,题目大意是:给定一数组,数组中每个元素代表一个宽度为1的墙,求由这些墙能装多少水,输入为[1,0,2,1,0,1,3,2,1,2,1],输出为6.时间复杂度为O(n),空间复杂度为O(1).#includeusingnamespacestd;intVolume(intA[],intn){i

    2025年10月10日
    5
  • python中执行shell命令

    python中执行shell命令原文出处 https blog 51cto com zhou123 这里介绍一下 python 执行 shell 命令的四种方法 1 os 模块中的 os system 这个函数来执行 shell 命令 gt gt gt os system ls anaconda ks cfginstall loginstall log syslogsend sms servic

    2026年2月26日
    1
  • 基于 msf 的免杀项目的一些工具「建议收藏」

    基于 msf 的免杀项目的一些工具「建议收藏」https://mp.weixin.qq.com/s/W7mBroOtVUdMHA7f07J_7Q转载自信安之路这两个月来持续的糜烂,乱七八糟的事,在今天lol完觉得不能再浪费时间来Orz,向大神们开始学习来0x02avet工具使用此工具当年在2017年黑帽大会上惊艳全场,使用kali下载:gitclonehttps://github.c…

    2022年8月20日
    6
  • Android EditText设置边框

    Android EditText设置边框AndroidEditT 设置边框简介 Android 应用程序中给 EditText 设置边框 效果图 快速开始在 res drawable 目录下新建样式文件 edit background xml xmlversion 1 0 encoding utf 8

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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