我有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)
。如何保持和的大小?
答案 0 :(得分:1)
无法弄清楚在renderInContext
应用于图层后如何翻译...所以不是将缩放的UIImageView图层粘贴到renderInContext
我创建了一个相同大小的UIView (0,0)
{{ 1}}然后我将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的图像...这是因为contentSize
是0:0 ...要解决此问题,而不是在UIImageView CGRectMake代码中使用contentSize,请使用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;
}