我在UIScrollView中有一个UIImageView(用Aspect Fill初始化)。
用户应使用它来调整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公式中,但是我真的无法将自己的头缠在上。

希望有人可以帮助我把这最后两米...

[编辑]

根据第一条评论,我尝试了以下方法。但是我的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];

最佳答案

您可能希望探索:

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

通过此方法和其他类似方法,您可以查看视图并根据其在 super 视图中的放置位置(而不是最初打算或放置的位置)来调整其坐标系。

关于ios - 根据UIScrollView内部的视口(viewport)裁剪UIImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7760191/

10-14 22:41