Обрезка UIImage в соответствии с областью просмотра внутри UIScrollView - PullRequest
2 голосов
/ 14 октября 2011

У меня есть UIImageView (инициализированный с Aspect Fill) внутри 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];

1 Ответ

1 голос
/ 14 октября 2011

Возможно, вы захотите изучить:

(CGRect)convertRect:(CGRect)rect toView:(UIView *)view

Этот и другие аналогичные методы позволяют вам брать вид и корректировать его систему координат на основе размещения в суперпредставлении, отличном от того, для которого оно было первоначально предназначено или позиционировано.для.

...