Обрезка UIImage в соответствии с видовым окном внутри UIScrollView
У меня есть UIImageView (инициализированный с заливкой аспекта) внутри UIScrollView. Пользователь должен использовать это, чтобы изменить размер и положение UIImage к своему подобию, нажать кнопку, и тогда точно то, что он видит на экране, будет отправлено на сервер, только в исходных координатах изображения. Другими словами, полученное изображение будет больше, чем изображение на экране.
Вот существенная часть моего кода до сих пор:
// select the original
CGFloat imageRatio = self.imageView.image.size.width / self.imageView.image.size.height;
CGFloat viewRatio = self.imageView.frame.size.width / self.imageView.frame.size.height;
CGFloat scale;
// get the scale factor of the image being "aspect-filled"
if(imageRatio < viewRatio) {
scale = self.imageView.image.size.width / self.imageView.frame.size.width;
} else {
scale = self.imageView.image.size.height / self.imageView.frame.size.height;
}
// get the cropping origin in the image's original coordinates
CGFloat originX = self.imageScrollView.contentOffset.x * scale;
CGFloat originY = self.imageScrollView.contentOffset.y * scale;
CGPoint origin = CGPointMake(originX, originY);
// get the cropping size in the image's original coordinates
CGFloat width = self.imageView.image.size.width / self.imageScrollView.zoomScale;
CGFloat height = self.imageView.image.size.height / self.imageScrollView.zoomScale;
CGSize size = CGSizeMake(width, height);
// create the new image from the original one
CGRect imageRect = CGRectMake(origin.x, origin.y, size.width, size.height);
struct CGImage *croppedCGImage = CGImageCreateWithImageInRect(self.imageView.image.CGImage, imageRect);
Это уже выглядит довольно близко к тому, что я хочу. Происхождение расчет, по крайней мере, кажется правильным. Тем не менее, есть еще некоторая разница в результирующем изображении, которая, как я предполагаю, исходит из различных соотношений сторон возможных изображений. Вероятно, мне нужно как-то добавить scale
к моим уравнениям size
, но я серьезно просто не могу понять, как .
[EDIT]
Согласно первому комментарию, я попробовал следующее. Но каким-то образом мойtargetFrame
всегда идентично scrollFrame
. Может быть, уже слишком поздно, чтобы я мог что-то сделать правильно??
CGFloat zoom = self.imageScrollView.zoomScale;
// the full image resolution
CGRect fullImageFrame = CGRectMake(0, 0,
self.imageView.image.size.width,
self.imageView.image.size.height);
UIView *fullImageView = [[[UIView alloc] initWithFrame:fullImageFrame] autorelease];
// the theoretical size of the image on the screen
CGRect previewImageFrame = CGRectMake(0, 0,
self.imageView.frame.size.width * zoom,
self.imageView.frame.size.height * zoom);
UIView *previewImageView = [[[UIView alloc] initWithFrame:previewImageFrame] autorelease];
// the excerpt of previewImageFrame really visible
CGRect scrollFrame = CGRectMake(self.imageScrollView.contentOffset.x,
self.imageScrollView.contentOffset.y,
self.imageScrollView.frame.size.width,
self.imageScrollView.frame.size.height);
// that excerpt transferred to the full resolution image's coordinates
CGRect targetFrame = [fullImageView convertRect:scrollFrame fromView:previewImageView];