以全分辨率从 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的主要内容,如果未能解决你的问题,请参考以下文章
在 iPhone 上使用 UIImageView 进行图像缩放
uiscrollview 缩放时,内容视图刷新但首先闪烁屏幕