Как обрезать 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];