這個問題說難不難,說簡單也不簡單,筆者當時確實花了很長一段時間才弄清楚,但是當問題解決后,感覺這特么也不復雜啊,之前怎么就沒整明白呢
問題是這樣的,在使用自定義相機拍完照后,需要對圖片的指定區域(藍色方框內的區域)進行截取然后上傳,這里存在兩個問題
拍攝時你所看到的區域,跟實際拍出來的區域是不一樣的
上圖就是實際拍出來的圖片,明顯比拍攝時看到的圖片要長,不過寬度是一樣的
照片的坐標系與我們平時開發所使用的坐標系是不一樣的開發中所使用的視圖坐標系是以左上角為原點的,橫向為x軸,縱向為y軸,而拍攝出來的照片是以右上角為原點的,橫向為y軸,縱向為x軸
我們先來看一幅圖
由于拍攝時所看到視圖寬高比與實際拍攝出來的圖片的寬高比并不一致,所以導致圖片經過等比例縮放到寬度一樣時,高度有一部分超出了我們的可視范圍,首先,我們要計算出超出部分的高度
1234 | //_cameraView為相機視圖,即拍攝時看到圖片的區域 CGFloat scale = image.size.width / _cameraView.width; //計算出縮放的比例 CGFloat showImageH = image.size.height / scale; //縮放后圖片的高度 CGFloat offsetY = (showImageH - _cameraView.height) * 0.5; //上下超出的部分是相等的,所以*0.5得出上面超過的部分 |
超出部分的高度計算完后,我們就要來計算藍色方框(_circleView,_cameraView的子控件)的坐標了
1234 | x:(offsetY+_circleView.y) * scale,別忘了乘以縮放比例 y:_circleView.x * scale,因為circleView在父控件中水平居中,所以_circleView在父控件中的x值乘以縮放比就是在圖片坐標系中的y值 width:_circleView.height scale height:_circleView.width scale |
然后根據計算好的frame截取圖片就ok了
123 | CGRect rect = CGRectMake(x, y, width,height); CGImageRef tailorImageRef = CGImageCreateWithImageInRect(photo.CGIma |
新聞熱點
疑難解答