CGImageCreateWithImageInRect

Я пытаюсь создать простое приложение для обрезки. У меня есть представление, наложенное на UIImage, и я хочу обрезать новое изображение только из той части UIImage, где накладывается представление. я использовал код

CGRect cropRect = _cropView.frame;
UIImage *cropImage = [UIImage imageWithData:imageData];
CGImageRef cropped = CGImageCreateWithImageInRect([cropImage CGImage], cropRect);
UIImage *croppedImage = [UIImage imageWithCGImage:cropped];
self.imageView.image = croppedImage;

но это привело к неожиданному изображению, которое казалось очень увеличенным, а не тем, что я хотел. Как я могу обрезать новое изображение из изображения за видом?


person cvrattos    schedule 12.07.2018    source источник


Ответы (2)


CGImage имеет дело с пикселями, а не с «точками» (абстрактная единица измерения UIKit). Когда contentScaleFactor вида обрезки больше 1, его размеры в пикселях будут больше, чем его размеры в точках. Итак, чтобы получить прямоугольник обрезки, соответствующий пикселям, вам нужно умножить все координаты и размеры frame представления на его contentScaleFactor.

CGRect cropRect = _cropView.frame;
cropRect.origin.x *= _cropView.contentScaleFactor;
cropRect.origin.y *= _cropView.contentScaleFactor;
cropRect.size.width *= _cropView.contentScaleFactor;
cropRect.size.height *= _cropView.contentScaleFactor;
person Ken Thomases    schedule 12.07.2018
comment
Я попробовал это, и это не решило проблему. Изображение по-прежнему слишком увеличено, а также повернуто на 90 градусов против часовой стрелки. - person cvrattos; 13.07.2018

Может быть, это поможет вам,

// Create new image context
CGSize size = _cropView.frame.size;

UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);

// Create rect for image
CGRect rect = _cropView.frame;

// Draw the image into the rect
[existingImage drawInRect:rect];

// Saving the image, ending image context
UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();
person Vicky_Vignesh    schedule 13.07.2018
comment
Спасибо за ваш ответ, но это тоже не сработало. Я все еще очень смущен своим выводом - person cvrattos; 13.07.2018