我想我可能有一个奇怪的要求,但希望有人能提供帮助。我正在使用众所周知的UIScrollView
+UIImageView
来放大和缩小图像以及平移。这很好用,但我们当前的项目需要能够裁剪图像,但如果图像小于裁剪矩形,还包括侧面的黑条。请参阅下面的图片。
我们希望捕获蓝色框内的所有内容,包括白色(将是黑色,因为 opaque 设置为YES
)。
这适用于完全缩小的图像(白色只是 UIImageView 的额外空间)。
但是,当我们尝试放大图像并仅捕获该部分以及空白区域时,就会出现问题。
这导致以下图像
我们看到的问题是我们需要能够创建一个与裁剪矩形中完全相同的图像,无论那里是否有图像的一部分。另一个问题是我们希望能够动态改变输出分辨率。纵横比为 16:9,对于本示例kMaxWidth = 1136
和kMaxHeight = 639
,但是将来我们可能希望请求更大或更小的 16:9 分辨率。
以下是我到目前为止的功能:
- (UIImage *)createCroppedImageFromImage:(UIImage *)image {
CGSize newRect = CGSizeMake(kMaxWidth, kMaxHeight);
UIGraphicsBeginImageContextWithOptions(newRect, YES, 0.0);
// 0 is the edge of the screen, to help with zooming
CGFloat xDisplacement = ((abs(0 - imageView.frame.origin.x) * kMaxWidth) / (self.cropSize.width / self.scrollView.zoomScale) / self.scrollView.zoomScale);
CGFloat yDisplacement = ((abs(self.cropImageView.frame.origin.y - imageView.frame.origin.y) * kMaxHeight) / (self.cropSize.height / self.scrollView.zoomScale) / self.scrollView.zoomScale);
CGFloat newImageWidth = (self.image.size.width * kMaxWidth) / (self.cropSize.width / self.scrollView.zoomScale);
CGFloat newImageHeight = (self.image.size.height * kMaxHeight) / (self.cropSize.height / self.scrollView.zoomScale);
[image drawInRect:CGRectMake(xDisplacement, 0, newImageWidth, newImageHeight)];
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return croppedImage;
}
任何帮助将不胜感激。