【问题标题】:Get zoomed image from UIImageView从 UIImageView 获取缩放图像
【发布时间】:2010-03-05 10:31:04
【问题描述】:

我在 UIScrollView 中使用 UIImageview 来让用户捏合和缩放图像。我现在想获取用户修改过的图像(小或放大)。我该怎么做?

谢谢。

好的,我现在正在尝试新的东西。我可以从介于两者之间的图像中获取缩略图吗? 我可以从 (0,0) 获取固定大小的缩略图。我可以从 (10, 20) 或 (30, 30) 中得到它吗?再次感谢。 我尝试将 CGImageCreateWithImageInRect 与具有这些 x 和 y 值的矩形一起使用。但它给了我从 0,0 点开始的图像

【问题讨论】:

  • “获取图像”是什么意思?您的意思是要根据该大小创建另一个 UIImage 吗?或者你想要一个图像文件?
  • 我想用调整后的图像创建一个 UIImage。
  • PPS - 适用于肖像图像。仅与横向图像有关..

标签: iphone uiscrollview uiimageview


【解决方案1】:

当你在 UIScrollView 中缩放 UIImageView 对象时,你只改变 UIImageView 框架,但图像属性中的 UIImage 保持不变。

如果您只想在其他 UIImageView 中显示缩放的此图像,则不应更改 UIImage 大小,只需将新 UIImageView 框架设置为与 UIScrollView 中缩放的 UIImageView 框架相同并使用相同的图像:

UIImageView * ImageViewOnScroll;
//set image and zoom it
... 
UIImageView * newImageView = [[UIImageView alloc] initWithImage:ImageViewOnScroll.image];
newImageView.frame = ImageViewOnScroll.frame;

如果由于某种原因您想创建具有更改大小的新 UIImage,您可以使用以下简单方法进行操作:

UIImage * resizeImage(UIImage * img, CGSize newSize){
    UIGraphicsBeginImageContext(newSize);

    //or other CGInterpolationQuality value
    CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationDefault);

    [img drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

【讨论】:

  • AFAIK 你提到的方法(resizeImage)只会给我裁剪图像的一部分。它不会给我放大的图像。
  • 感谢 vladd,给了我一个实现目标的想法。请查看更新后的问题。
  • 以上代码(resizeImage 方法)返回调整大小的整个图像。要获取原始图像的一部分,请使用 CGImageCreateWithImageInRect(CGImageRef image, CGRect rect);结合 CGImageCreateWithImageInRect 和在上下文中绘图,您可以获取图像的任何部分,将其调整为任何大小,并将其放置在新图像的任何区域中。
【解决方案2】:

我通过创建一个微小的 UIImage 扩展(兼容 Swift 5.2)解决了这个问题,当您在 UIScrollView 中嵌入了 UIImageView 时,它可以完美运行:

extension UIImage {

    func crop(from scrollView: UIScrollView) -> UIImage? {
            let zoom: CGFloat = 1.0 / scrollView.zoomScale
            let xOffset: CGFloat = (size.width / scrollView.contentSize.width) * scrollView.contentOffset.x
            let yOffset: CGFloat = (size.height / scrollView.contentSize.height) * scrollView.contentOffset.y

            let cropRect = CGRect(xOffset * scale, yOffset * scale, size.width * zoom * scale, size.height * zoom * scale)

            guard let croppedImageRef = cgImage?.cropping(to: cropRect) else { return nil }
            let croppedImage = UIImage(cgImage: croppedImageRef, scale: scale, orientation: imageOrientation)

            return croppedImage
    }

}

用它来放大图像的一部分:

let croppedImage = sourceImage.crop(from: scrollView)

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多