【问题标题】:ios - Can crop photo vertical but not horizontalios - 可以垂直裁剪照片但不能水平裁剪
【发布时间】:2016-02-08 20:50:10
【问题描述】:

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

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

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

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

这是一个缩小以适应屏幕的纵向图像:

接下来,我放大图像,这样就没有黑色空间了。

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

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

这是一张缩小的横向图片。

接下来,我放大,所以没有留下黑色空间。请注意我是如何特别放大的,所以照片中看不到白板的物理边界。

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

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

这是我用来从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;

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

任何帮助将不胜感激。

【问题讨论】:

    标签: ios objective-c image crop cgrect


    【解决方案1】:

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

    我找到了一个非常简单的方法,那就是截取滚动视图中可见内容的屏幕截图,就这么简单:

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多