NSImage по сравнению с CIImage по сравнению с CGImage?

Правильное Swift 3.0 для iOS 10+ решение: Использование ImageRenderer и синтаксис закрытия:

func imageWith(newSize: CGSize) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: newSize)
    let image = renderer.image { _ in
        self.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return image
}

А вот версия Objective C:

@implementation UIImage (ResizeCategory)
- (UIImage *)imageWithSize:(CGSize)newSize
{
    UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize];
    UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {
        [self drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}];
    }];
    return image;
}
@end
20
задан Quinn Taylor 11 July 2009 в 21:51
поделиться

1 ответ

NSImage - это абстрактный тип данных, который может представлять множество различных типов изображений, а также несколько представлений изображения. Это часто бывает полезно, когда фактический тип изображения не важен для того, что вы пытаетесь сделать. Это также единственный класс изображений, который AppKit будет принимать в своих API (NSImageView и т. Д.).

CGImage может представлять только растровые изображения. Если вам нужно разобраться с фактическими данными растрового изображения, CGImage - подходящий тип для использования. Для операций в CoreGraphics, таких как режимы наложения и маскирование, требуется CGImageRefs. CGImageRefs может использоваться для создания NSBitmapImageRefs, которые затем могут быть добавлены к NSImage.

Я думаю, что документация описывает CIImage лучше всего:

Хотя объект CIImage имеет связанные с ним данные изображения, это не изображение. Вы можете думать об объекте CIImage как о «рецепте» изображения. Объект CIImage имеет всю информацию, необходимую для создания изображения, но Core Image фактически не отображает изображение, пока ему не будет дано указание сделать это. Этот метод «ленивой оценки» позволяет работать с Core Image с максимальной эффективностью.

CIImages - это тип, необходимый для использования различных фильтров Core Image, оптимизированных для GPU, которые поставляются с Mac OS X, но, как и CGImageRefs, они также могут быть преобразован в NSBitmapImageReps.

47
ответ дан 29 November 2019 в 23:27
поделиться