Размер NSImage не является реальным размером с некоторыми фотографиями?
Я вижу, что иногда размер 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]()
Так как это может быть? Может быть, я что-то делаю неправильно?
Ответы
Ответ 1
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];
Ответ 2
Возвращает размер метода 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
Ответ 3
Благодаря 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)))
})
}
Ответ 4
Если ваш файл содержит только одно изображение, вы можете просто использовать это:
let rep = image.representations[0]
let imageSize = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)
изображение - это ваше NSImage, imageSize - это размер изображения в пикселях.
Скопировано и обновлено: fooobar.com/info/216325/...