NSImage размер не реальный размер с некоторыми картинками? - PullRequest
27 голосов
/ 13 февраля 2012

Я вижу, что иногда размер NSImage не является реальным размером (с некоторыми изображениями), а размер CIImage всегда реален. Я тестировал с этим изображением .

Это исходный код, который я написал для тестирования:

NSImage *_imageNSImage = [[NSImage alloc]initWithContentsOfFile:@"<path to image>"];

NSSize _dimensions = [_imageNSImage size];

[_imageNSImage release];

NSLog(@"Width from CIImage: %f",_dimensions.width);
NSLog(@"Height from CIImage: %f",_dimensions.height);




NSURL *_myURL = [NSURL fileURLWithPath:@"<path to image>"];
CIImage *_imageCIImage = [CIImage imageWithContentsOfURL:_myURL];


NSRect _rectFromCIImage = [_imageCIImage extent];

NSLog(@"Width from CIImage: %f",_rectFromCIImage.size.width);
NSLog(@"Height from CIImage: %f",_rectFromCIImage.size.height);

И вывод:

enter image description here

Так как это может быть ?? Может я что-то не так делаю?

Ответы [ 4 ]

41 голосов
/ 13 февраля 2012

NSImage size метод возвращает информацию о размере, которая зависит от разрешения экрана.Чтобы получить размер, представленный в реальном изображении файла, вам нужно использовать NSImageRep.Вы можете получить NSImageRep из NSImage, используя метод representations.В качестве альтернативы вы можете создать экземпляр подкласса NSBitmapImageRep, например, так:

NSArray * imageReps = [NSBitmapImageRep imageRepsWithContentsOfFile:@"<path to image>"];

NSInteger width = 0;
NSInteger height = 0;

for (NSImageRep * imageRep in imageReps) {
    if ([imageRep pixelsWide] > width) width = [imageRep pixelsWide];  
    if ([imageRep pixelsHigh] > height) height = [imageRep pixelsHigh];  
}

NSLog(@"Width from NSBitmapImageRep: %f",(CGFloat)width);
NSLog(@"Height from NSBitmapImageRep: %f",(CGFloat)height);

Цикл учитывает, что некоторые форматы изображений могут содержать более одного изображения (например, TIFF).

Вы можете создать NSImage в этом размере, используя следующее:

NSImage * imageNSImage = [[NSImage alloc] initWithSize:NSMakeSize((CGFloat)width, (CGFloat)height)];
[imageNSImage addRepresentations:imageReps];
5 голосов
/ 22 июля 2016

Спасибо Zenopolis за оригинальный код ObjC, вот хорошая и краткая версия Swift:

func sizeForImageAtURL(url: NSURL) -> CGSize? {
        guard let imageReps = NSBitmapImageRep.imageRepsWithContentsOfURL(url) else { return nil }
        return imageReps.reduce(CGSize.zero, combine: { (size: CGSize, rep: NSImageRep) -> CGSize in
            return CGSize(width: max(size.width, CGFloat(rep.pixelsWide)), height: max(size.height, CGFloat(rep.pixelsHigh)))
        })
    }
5 голосов
/ 18 октября 2015

Метод размера NSImage, возвращаемый размер в пунктах.Чтобы получить размер, представленный в пикселях, необходимо проверить свойство NSImage.representations, которое содержит массив объектов NSImageRep со свойствами pixelWide / pixelHigh и объект NSImage простого изменения размера:

@implementation ViewController {
    __weak IBOutlet NSImageView *imageView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do view setup here.

    NSImage *image = [[NSImage alloc] initWithContentsOfFile:@"/Users/username/test.jpg"];

    if (image.representations && image.representations.count > 0) {
        long lastSquare = 0, curSquare;
        NSImageRep *imageRep;
        for (imageRep in image.representations) {
            curSquare = imageRep.pixelsWide * imageRep.pixelsHigh;
            if (curSquare > lastSquare) {
                image.size = NSMakeSize(imageRep.pixelsWide, imageRep.pixelsHigh);
                lastSquare = curSquare;
            }
        }

        imageView.image = image;
        NSLog(@"%.0fx%.0f", image.size.width, image.size.height);
    }
}

@end
0 голосов
/ 09 октября 2017

Если ваш файл содержит только одно изображение, вы можете просто использовать это:

let rep = image.representations[0]
let imageSize = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)

image - это ваш NSImage, imageSize - это размер изображения в пикселях.

Скопировано и обновлено здесь:https://stackoverflow.com/a/13228091/3608824

...