Обрезать изображение в CGRect всегда начинается с x: 0 и y: 0 - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть этот фрагмент кода, который отлично работает на моей стороне, он обрезает изображение на основе размера моего перетаскиваемого UIImageView (который называется cropOverlay):

func cropImage() {
        let rect = CGRect(x: cropOverlay.frame.origin.x, y: cropOverlay.frame.origin.y, width: cropOverlay.frame.size.width, height: cropOverlay.frame.size.height)
        UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0)
        originalImgView.layer.render(in: UIGraphicsGetCurrentContext()!)
        imageToEdit = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        originalImgView.image = imageToEdit
        resizeImageViewToImageSize(originalImgView)
        cropOverlay.frame = originalImgView.frame

        print("cropOverlay: \(cropOverlay.frame)")
        print("originalImgView: \(originalImgView.frame)")
        print("imageToEdit: \(imageToEdit.size.width) - \(imageToEdit.size.height)\n")
    }

вот что я получаюв консоли XCode:

cropOverlay: (139.25111636459152, 154.66666666666663, 135.49776727081695, 426.66666666666674)
originalImgView: (139.25111636459152, 154.66666666666663, 135.49776727081695, 426.66666666666674)
imageToEdit: 134.33333333333334 - 423.0

Итак, мой журнал консоли показывает правильные позиции X и Y моего cropOverlay imageView, а также данные моего originalImageView кадра.Но проблема в том, что не имеет значения, куда я перемещаю свой cropOverlay imageView, даже если консоль говорит, что это в X: 139 и Y: 154, изображение, которое я получаю в результате, начинается с X.0 и Y: 0,Проверьте эти скриншоты для лучшего понимания моей проблемы:

ДО
BEFORE...

ПОСЛЕПРИМЕНЕНИЕ функции cropImage ()
AFTER



PS: моя функция resizeImageViewToImageSize(originalImgView) просто изменяет размер кадра originalImageView соответственнок его размеру UIImage и центрирует его на экране.
Как вы можете видеть, размер обрезанного изображения правильный, но он начался с X и Y = 0 моего исходного изображения.

Что яделать неправильно в моем коде?

Спасибо!


ОБНОВЛЕНИЕ: Как указано ниже, я отредактировал свою функцию cropImage () следующим образом:

func cropImage() {

        let cutImageRef: CGImage = (originalImgView.image!.cgImage?.cropping(to: cropOverlay.frame))!
        imageToEdit = UIImage(cgImage: cutImageRef)

        originalImgView.image = imageToEdit
        resizeImageViewToImageSize(originalImgView)
        cropOverlay.frame = originalImgView.frame

}


Но вот результат, который я получаю:

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018
UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)

Первый тип параметра - CGSize, а не CGRect.Вы можете попробовать это:

CGImageRef sourceImageRef = [originalImageView.image CGImage];
CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
CGImageRelease(newImageRef);
0 голосов
/ 26 сентября 2018

Вы можете использовать метод Apple для CGImage

https://developer.apple.com/documentation/coregraphics/cgimage/1454683-cropping

кадрирование (до:)

Создает растровое изображение, используя данные, содержащиеся в субрегионесуществующего растрового изображения.

enter image description here Например:

let cutImageRef: CGImage = originalImgView.image.cgImage?.cropping(to: cropOverlay.frame)
let croppedImage: UIImage = UIImage(cgImage: cutImageRef)

Обновление:

Также вы должны использовать весы, потому что размер вашего изображения не совпадает с размером изображения

if let image = imageView.image {
  let wScale = (image.size.width / imageView.frame.width) * UIScreen.main.scale
  let hScale = (image.size.height / imageView.frame.height) * UIScreen.main.scale
  ...
  // Create cropping area using scales
}
...