繁体   English   中英

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

[英]Capture scaled UIImageView from within UIScrollView at full resolution

我有一个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) 如何保持大小原产地?

在将renderInContext应用于图层后无法弄清楚如何翻译...因此,与其将缩放的UIImageView的图层粘贴到renderInContext我在原点(0,0)创建了一个相同大小的UIView,然后将renderInContext添加为子视图到我刚刚创建的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();

编辑:应注意,如果用户未对图像进行任何调整,而是在进行裁剪时未按原样保留图像,则它将返回width:height = 0:0的图像...这是因为contentSize为0:0 ...为了解决此问题,而不是在UIImageView CGRectMake代码中使用contentSize,请使用float变量并以如下方式定义float变量:如果它们等于零,则只需将其设置为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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM