Android圖片裁剪之自由裁剪

來源:互聯網
上載者:User

標籤:android   style   blog   http   color   os   java   使用   io   

我的部落格http://blog.csdn.net/dawn_moon


  客戶的需求都是非常怪的。我有時候在給客戶做項目的時候就想罵客戶是sb。可是請你相信我,等你有需求,自己變成客戶的時候,給你做項目的哥哥肯定也會罵你是sb。


  是這種,客戶須要做一個圖片上傳的功能,這個圖片須要裁剪。一般而言,這東西用系統內建的裁剪就搞定了。但是客戶不,他要能夠自由裁剪,就是長寬比不固定,想裁成什麼比例就裁成什麼比例,我一聽,蛋都碎了。


  沒有辦法,客戶sb歸sb,需求還是得照做,不然不給錢要喝西北風了。


  圖片裁剪的功能系統內建了,和我的需求僅僅有一點不一樣,就是它是固定寬高比的,設定了寬高比就不能再改變,而我須要自由寬高比。好吧,既然僅僅有這一點不一樣,那給他改改即可了。


  事實上我這人是非常懶的,我早就想Google一下看有沒有人寫好的,拿來改下直接用好了。但是找了一圈,僅僅有一個哥哥自己寫了一個自己定義裁剪的功能。跑了一下,準系統能夠實現,但是太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;                }            }
這裡去掉了寬高比計算。

然後基本就完畢了。




Android圖片裁剪之自由裁剪

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.