gpt4 book ai didi

ios - 从较大的 UIImage 中裁剪一部分 UIImage,并包括非图像部分

转载 作者:行者123 更新时间:2023-12-01 19:06:40 28 4
gpt4 key购买 nike

我想我可能有一个奇怪的要求,但希望有人能提供帮助。我正在使用众所周知的UIScrollView + UIImageView放大和缩小图像以及平移。这很好用,但我们当前的项目需要能够裁剪图像,但如果图像小于裁剪矩形,还包括侧面的黑条。请参阅下面的图片。

我们希望捕获蓝色框内的所有内容,包括白色(将是黑色,因为 opaque 设置为 YES )。


这适用于完全缩小的图像(白色只是 UIImageView 的额外空间)。
enter image description here

但是,当我们尝试放大图像并仅捕获该部分以及空白区域时,就会出现问题。
enter image description here

这导致以下图像
enter image description here

我们看到的问题是我们需要能够创建一个与裁剪矩形中完全相同的图像,无论那里是否有图像的一部分。另一个问题是我们希望能够动态改变输出分辨率。纵横比为 16:9,在本例中为 kMaxWidth = 1136kMaxHeight = 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;
}

任何帮助将不胜感激。

最佳答案

我最终只是截取了一个截图,然后裁剪了它。它似乎工作得很好。

- (UIImage *)cropImage {
CGRect cropRect = self.cropOverlay.cropRect;
UIGraphicsBeginImageContext(self.view.frame.size);

[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGImageRef croppedImage = CGImageCreateWithImageInRect(fullScreenshot.CGImage, cropRect);
UIImage *crop = [[UIImage imageWithCGImage:croppedImage] resizedImage:self.outputSize interpolationQuality:kCGInterpolationHigh];
CGImageRelease(croppedImage);
return crop;
}

如果使用 iOS 7,您将使用 drawViewHierarchyInRect:afterScreenUpdates: , 而不是 renderInContext:

关于ios - 从较大的 UIImage 中裁剪一部分 UIImage,并包括非图像部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187222/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com