从 UIImage 返回子图像

Posted

技术标签:

【中文标题】从 UIImage 返回子图像【英文标题】:Return a subimage from a UIImage 【发布时间】:2011-05-27 10:16:41 【问题描述】:

我想从 UIImage 中获取子图像。我环顾四周寻找类似的问题,但无济于事。

我知道我想要抓取的像素范围 - 如何从现有图像返回这个子图像?

【问题讨论】:

【参考方案1】:

这应该会有所帮助:http://iphonedevelopment.blogspot.com/2010/11/drawing-part-of-uiimage.html

这段代码 sn-p 正在创建一个 UIImage 类别,但代码应该很容易修改,以便在它不是一个类别的情况下工作。

做同样事情的更短的方法如下:

CGRect fromRect = CGRectMake(0, 0, 320, 480); // or whatever rectangle

CGImageRef drawImage = CGImageCreateWithImageInRect(image.CGImage, fromRect);
UIImage *newImage = [UIImage imageWithCGImage:drawImage];
CGImageRelease(drawImage);

希望这会有所帮助!

【讨论】:

这种方式应该在主线程下运行,不是线程安全的方式。 这不适用于视网膜设备,因为它会剪切原始图像而不是视网膜屏幕中的表示(即,如果 320x480 是正常的,而 640x960 是原始图像的视网膜分辨率,具有 (0, 0, 320, 480) 的 CGRect 会在视网膜上切掉图像的左上四分之一) @ohcibi 要使这个 coed 也适用于视网膜,您需要获取图像的比例因子 (image.scale),将其应用于矩形(将所有数值乘以该因子)和在创建最终的UIImage 时,使用imageWithCGImage:scale:orientation: 方法再次设置正确的比例因子。【参考方案2】:

更新了 swift 3 的 @donkim 答案:

    let fromRect=CGRect(x:0,y:0,width:320,height:480)
    let drawImage = image.cgImage!.cropping(to: fromRect)
    let bimage = UIImage(cgImage: drawImage!)

【讨论】:

【参考方案3】:

在 Swift 4 中,考虑到屏幕比例(否则你的新图像会太大):

    let img = UIImage(named: "existingImage")!
    let scale = UIScreen.main.scale
    let dy: CGFloat = 6 * scale // say you want 6pt from bottom
    let area = CGRect(x: 0, y: img.size.height * scale - dy, width: img.size.width * scale, height: dy)
    let crop = img.cgImage!.cropping(to: area)!
    let subImage = UIImage(cgImage: crop, scale: scale, orientation:.up)

【讨论】:

以上是关于从 UIImage 返回子图像的主要内容,如果未能解决你的问题,请参考以下文章

将UIImage转换为NSData并返回UIImage

UIImage 视图从一个图像动画到下一个图像

从 UIImage 生成哈希

我应该从 UIActivity activityImage 返回啥 UIImage?

加载图像异步并返回UIImage的公共函数

如何处理 NSData 并返回 UIImage (Swift)