如何通过给出边界来修剪NSImage

时间:2016-03-12 15:28:46

标签: macos nsimage

我有一个NSImage对象,我有一个CIDetector对象,可以检测该图像上的QR码。在检测到之后,我想修剪该图像,使其只有QR码。这就是我获得二维码的界限:

<td>

现在我如何修剪图像,使其仅包含<tr> <td>Krack</td> <td id="7" class="level" sorttable_customkey="7"> <img src="../img/CL7.png" alt="7"> </td> </tr> 变量描述的区域。

3 个答案:

答案 0 :(得分:0)

您需要创建一个新的*并绘制您想要的原始图像部分。

NSImage

答案 1 :(得分:0)

在Swift 5中

func trim(image: NSImage, rect: CGRect) -> NSImage {
    let result = NSImage(size: rect.size)
    result.lockFocus()

    let destRect = CGRect(origin: .zero, size: result.size)
    image.draw(in: destRect, from: rect, operation: .copy, fraction: 1.0)

    result.unlockFocus()
    return result
}

答案 2 :(得分:0)

answer from onmyway133 很棒,但它不保留源图像的数据类型。例如,如果您的源是 .hdr 图像,则每个颜色通道都将是浮动的,但裁剪后的图像将是 8 位整数 RGBA 图像。

为了保留源的格式,您似乎必须深入到相关联的 CGImage。我这样做:

extension NSImage {
    func cropping(to rect: CGRect) -> NSImage {
        var imageRect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        guard let imageRef = self.cgImage(forProposedRect: &imageRect, context: nil, hints: nil) else {
            return NSImage(size: rect.size)
        }
        guard let crop = imageRef.cropping(to: rect) else {
            return NSImage(size: rect.size)
        }
        return NSImage(cgImage: crop, size: NSZeroSize)
    }
}