从 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 返回子图像的主要内容,如果未能解决你的问题,请参考以下文章