以全分辨率从 UIScrollView 中捕获缩放的 UIImageView

Posted

技术标签:

【中文标题】以全分辨率从 UIScrollView 中捕获缩放的 UIImageView【英文标题】:Capture scaled UIImageView from within UIScrollView at full resolution 【发布时间】:2013-11-07 20:08:43 【问题描述】:

我有一个UIImageView,其图像为 640x1136。我希望用户能够在裁剪区域(也是 640x1136)内缩放和转换图像,然后将新裁剪的图像重新保存为 640x1136(捏/拉/滑动),所以我将其卡在 UIScrollView 中并缩小了两者它们缩小到 100x178 左右,并添加了滚动功能-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

一切正常!我可以移动图像,缩小和缩放它,它在子视图的边缘被“剪裁”了!所以现在我被困在试图弄清楚如何以最大分辨率截取它的屏幕截图?我可以使用CGContext 截取屏幕截图,它会显示正确的“裁剪”图像部分,但分辨率是 100x178,所以我将整个画面缩放到 640x1136,然后截取屏幕截图,但问题是滚动视图中的内容没有不要扩大规模,所以现在作物都搞砸了!有什么好的解决办法吗?


这是我尝试过的代码;它没有用:

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 1136), YES, 0.0);
    UIImageView *theImageToCrop = [[UIImageView alloc] initWithFrame:CGRectMake(0-(theScrollView.contentOffset.x*(640/theScrollView.frame.size.width)), 0-(theScrollView.contentOffset.y*(1136/theScrollView.frame.size.height)), theScrollView.contentSize.width*(640/theScrollView.frame.size.width), theScrollView.contentSize.height*(1136/theScrollView.frame.size.height))];
    theImageToCrop.contentMode = UIViewContentModeScaleAspectFill;
    theImageToCrop.image = originalImageView.image;
    CGContextRef context = UIGraphicsGetCurrentContext();
    [theImageToCrop.layer renderInContext:context];
    croppedImage.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

我已经可以看出问题是当我截取最终屏幕截图时图像没有被翻译。它正在缩放到在UIImageView 中缩放到的正确大小,但未设置内容偏移量。我将它设置在我使用CGRectMake 创建的框架中,但我有一种感觉,当我使用此代码时:[theImageToCrop.layer renderInContext:context]; 大小保持不变,但原点重置为(0,0)。如何保持尺寸原点?

【问题讨论】:

【参考方案1】:

renderInContext 应用于图层后无法弄清楚如何翻译...所以我没有将缩放的 UIImageView 图层粘贴到renderInContext 中,而是在原点(0,0) 创建了一个相同大小的 UIView 然后我添加了imageView 作为我刚刚创建的 UIView 的子视图,并在视图中翻译了它然后我将 renderInContext 应用于该视图!

UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 1136), YES, 0.0);
UIView *theImageHolder = [[UIView alloc] initWithFrame:CGRectMake(0,0,640,1136)];
UIImageView *theImageToCrop = [[UIImageView alloc] initWithFrame:CGRectMake(0-(theScrollView.contentOffset.x*(640/theScrollView.frame.size.width)), 0-(theScrollView.contentOffset.y*(1136/theScrollView.frame.size.height)), theScrollView.contentSize.width*(640/theScrollView.frame.size.width), theScrollView.contentSize.height*(1136/theScrollView.frame.size.height))];
theImageToCrop.contentMode = UIViewContentModeScaleAspectFill;
theImageToCrop.image = originalImageView.image;
CGContextRef context = UIGraphicsGetCurrentContext();
[theImageHolder addSubview:theImageToCrop];
[theImageHolder.layer renderInContext:context];
croppedImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

edit:应该注意的是,如果用户没有对图像进行任何调整,而不是在执行裁剪时保持图像原样,它将返回一个宽度:高度 = 0:0 的图像......这是因为contentSize 是 0:0 ... 要解决此问题,而不是在 UIImageView CGRectMake 代码中使用 contentSize,请使用浮点变量并定义浮点变量,如果它们等于 0,它们只会设置为您的 UIScrollView 框架(如果用户根本不捏它们以缩放它们,它们将具有相同的大小!

float scaleWidth = imageAdjustView.contentSize.width;
float scaleHeight = imageAdjustView.contentSize.height;
if (scaleWidth == 0) 
    scaleWidth = imageAdjustView.frame.size.width;

if (scaleHeight == 0) 
    scaleHeight = imageAdjustView.frame.size.height;

【讨论】:

以上是关于以全分辨率从 UIScrollView 中捕获缩放的 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView:缩放后无法建立现状

在 iPhone 上使用 UIImageView 进行图像缩放

uiscrollview 缩放时,内容视图刷新但首先闪烁屏幕

IOS如何以全分辨率从相机胶卷中选择图像

以全尺寸保存 UIImage,包括从 UIImageView 进行的转换

在另一个视图中滚动 UIScrollView 时更快地滚动它