0

我有一个UIImageView640x1136 的图像。我希望用户能够在裁剪区域(也是 640x1136)内缩放和转换图像,然后将新裁剪的图像重新保存为 640x1136(捏/拉/滑动),所以我将它卡在 aUIScrollView中并将它们都缩小到大约 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). 我怎样才能保持大小原产地?

4

1 回答 1

1

无法弄清楚如何在renderInContext应用到图层后进行翻译......所以我没有将缩放的 UIImageView 的图层粘贴到renderInContext我在原点创建一个相同大小的 UIView(0,0)然后我将 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();

编辑:应该注意的是,如果用户没有对图像进行任何调整,而不是在执行裁剪时保持图像原样,它将返回一个宽度:高度 = 0:0 的图像......这是因为contentSize0 :0 ...要解决此问题,而不是在 UIImageView CGRectMake 代码中使用 contentSize ,请使用浮点变量并定义浮点变量,如果它们等于零,它们只会设置为 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;
}
于 2013-11-07T20:57:45.543 回答