Как обрезать NSImage, задавая границы

У меня есть объект NSImage, у меня есть объект CIDetector, который обнаруживает QR-коды на этом изображении. После того, как он обнаружит, я хочу обрезать это изображение, чтобы в нем был только QR-код. Вот как я получил границы QR-кода:

NSArray *features = [myQRDetector featureInImage:myCIImage];
CIQRCodeFeature *qrFeature = features[0];
CGRect qrBounds = qrFeature.bounds;

Теперь, как я могу обрезать изображение так, чтобы оно содержало только область, описанную qrBounds переменная.

3 ответа

В Свифт 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
}

Ответ от onmyway133 велика, но она не сохраняет тип данных исходного изображения. Например, если ваш источник .hdr image, каждый цветовой канал будет плавающим, но обрезанное изображение будет 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)
    }
}

Вам нужно создать новый NSImage и нарисуйте ту часть исходного изображения, которую вы хотите.

NSImage* newImage = [[NSImage alloc] initWithSize:NSSizeFromCGSize(qrBounds.size)];
[newImage lockFocus];
NSRect dest = { NSZeroPoint, newImage.size };
[origImage drawInRect:dest fromRect:NSRectFromCGRect(qrBounds) operation:NSCompositeCopy fraction:1];
[newImage unlockFocus];
Другие вопросы по тегам