ios - 可以裁剪照片垂直但不是水平

时间:2015-11-07 21:59:11

标签: ios objective-c image crop cgrect

我的UIScrollView内有UIImageView。对于我的应用程序的这一部分,用户可以从他们的相机胶卷中选择照片并缩放并裁剪它们。

我已成功让用户可以选择不同的照片,然后放大和缩小&平移图像。此外,用户可以缩小以使图像中心垂直或水平,具体取决于图像是纵向还是横向。

问题是,我尝试将滚动视图中可见矩形的照片裁剪为新图像,但它仅适用于肖像照片。

这是一个工作然后不工作的例子:

以下是缩小以适合屏幕的肖像图像:

enter image description here

接下来,我放大图像,以便没有黑色空间。

enter image description here

最后,我裁剪照片,你可以看到它在左上角完美裁剪。

enter image description here

但是,出于某些原因,当我尝试使用风景图像进行此操作时,裁剪会混乱?!这是一个不起作用的例子。

以下是缩小的风景图片。

enter image description here

接下来,我放大,因此没有留下黑色空间。请注意我是如何专门放大的,因此照片中没有白板的物理边框。

enter image description here

现在,我像以前一样裁剪照片并且没有正确裁剪。注意图像的左上角如何与之前不同。它似乎已缩小,您可以看到白板的更多底部。

enter image description here

我需要弄清楚为什么会发生这种情况以及如何解决它。

以下是我用来从UIScrollView裁剪照片的确切代码。

    //Get the scale
    float scale = 1.0f/_libraryScrollView.zoomScale;

    //Create a new rect
    CGRect visibleRect;
    visibleRect.origin.x = _libraryScrollView.contentOffset.x * scale;
    visibleRect.origin.y = _libraryScrollView.contentOffset.y * scale;
    visibleRect.size.width = _libraryScrollView.bounds.size.width * scale;
    visibleRect.size.height = _libraryScrollView.bounds.size.height * scale;

    //Get the source image
    UIImage *src = libraryPreviewImageView.image;

    //Create the new cropped image with the rect
    CGImageRef cr = CGImageCreateWithImageInRect(src.CGImage, visibleRect);
    UIImage *finalImage = [[UIImage alloc]initWithCGImage:cr];

    //Set the new image to the preview image view
    self.imagePreviewView.image = finalImage;

此代码适用于纵向图像,但不适用于横向图像,如上例所示。这个错误与我的裁剪代码有关,还是与其他东西有关?

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

最后,我不知道问题是什么,但是尝试使用数学从滚动视图中裁剪图像非常困难!

我找到了一种非常简单的方法,就是在滚动视图中拍摄可见内容的屏幕截图,它就像这样简单:

UIGraphicsBeginImageContextWithOptions(_libraryScrollView.bounds.size, YES, [UIScreen mainScreen].scale);
CGPoint offset = _libraryScrollView.contentOffset;
CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -offset.x, -offset.y);
[_libraryScrollView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//Set the new image to the preview image view
self.imagePreviewView.image = finalImage;

我真的希望这个答案也可以帮助其他人!