Macos N图片大小不是一些图片的真实大小?
我发现有时候NSImage的大小不是真实的大小(有些图片),而CIImage的大小总是真实的。我正在测试这个 这是我为测试而编写的源代码:Macos N图片大小不是一些图片的真实大小?,macos,cocoa,core-graphics,nsimage,Macos,Cocoa,Core Graphics,Nsimage,我发现有时候NSImage的大小不是真实的大小(有些图片),而CIImage的大小总是真实的。我正在测试这个 这是我为测试而编写的源代码: NSImage *_imageNSImage = [[NSImage alloc]initWithContentsOfFile:@"<path to image>"]; NSSize _dimensions = [_imageNSImage size]; [_imageNSImage release]; NSLog(@"Width from
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);
NSImage*\u imagesnimage=[[NSImage alloc]initWithContentsOfFile:@'';
NSSize _维度=[_图像大小];
[_图像发布];
NSLog(@“从CIImage开始的宽度:%f”,_dimensions.Width);
NSLog(@“距离CIImage的高度:%f”,_维度。高度);
NSURL*_myURL=[NSURL fileURLWithPath:@'';
CIImage*_-imageCIImage=[CIImage-imageWithContentsOfURL:_-myURL];
NSRect\u rectFromCIImage=[\u imageCIImage范围];
NSLog(@“来自CIImage的宽度:%f”,\u rectFromCIImage.size.Width);
NSLog(@“距离CIImage的高度:%f”,_rectFromCIImage.size.Height);
输出为:
那怎么可能呢??可能我做错了什么?
NSImage
size
方法返回与屏幕分辨率相关的大小信息。要获得实际文件图像中表示的大小,需要使用NSImageRep
。您可以使用representations
方法从NSImage
获取NSImageRep
。或者,您可以直接创建一个子类实例,如下所示:
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);
NSImage
size
方法返回取决于屏幕分辨率的大小信息。要获得实际文件图像中表示的大小,需要使用NSImageRep
。您可以使用representations
方法从NSImage
获取NSImageRep
。或者,您可以直接创建一个子类实例,如下所示:
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);
NSImage size方法返回以点为单位的大小。要获取以像素表示的大小,需要检查NSImage.representations属性,该属性包含具有pixelWide/pixelHigh属性和简单更改大小NSImage对象的NSImageRep对象数组:
@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
NSImage size方法返回以点为单位的大小。要获取以像素表示的大小,需要检查NSImage.representations属性,该属性包含具有pixelWide/pixelHigh属性和简单更改大小NSImage对象的NSImageRep对象数组:
@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
感谢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)))
})
}
感谢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)))
})
}
如果您的文件仅包含一个图像,则可以使用以下方法:
let rep = image.representations[0]
let imageSize = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)
image是您的NSImage,imageSize是以像素为单位的图像大小
此处复制并更新:如果您的文件仅包含一个图像,您可以使用以下内容:
let rep = image.representations[0]
let imageSize = NSSize(width: rep.pixelsWide, height: rep.pixelsHigh)
image是您的NSImage,imageSize是以像素为单位的图像大小
此处复制并更新:感谢您提供的精美壁纸!谢谢你的壁纸!谢谢,还有一个问题。现在我知道了真实的尺寸,但NSImage在那个尺寸下很小。。如何避免这种情况?我需要使用NSImage。例如,我将NSView帧更改为图像的真实大小,但在该帧中NSImage绘制得很小。我对答案做了一些更改,这应该会有所帮助。很好。下面我为喜欢这种语言的人提供了答案:)回答得很好。我一直在使用很多图像集,我只是第一次遇到这种情况。通过查看图像元数据,我没有看到任何指示图像应以较低分辨率读取的内容。此外,它是JPEG图像,但包含TIFF元数据?为什么NSImage决定在某些情况下使用较小的表示形式?我刚刚遇到一个案例,我阅读了2008x1340 JPEG,NSImage报告其大小高达144576 x 96480。imageRep像素大小为正确的2008x1340。选择最大的就这么多了。谢谢,还有一个问题。现在我知道了真实的尺寸,但NSImage在那个尺寸下很小。。如何避免这种情况?我需要使用NSImage。例如,我将NSView帧更改为图像的真实大小,但在该帧中NSImage绘制得很小。我对答案做了一些更改,这应该会有所帮助。很好。下面我为喜欢这种语言的人提供了答案:)回答得很好。我一直在使用很多图像集,我只是第一次遇到这种情况。通过查看图像元数据,我没有看到任何指示图像应以较低分辨率读取的内容。此外,它是JPEG图像,但包含TIFF元数据?为什么NSImage决定在某些情况下使用较小的表示形式?我刚刚遇到一个案例,我阅读了2008x1340 JPEG,NSImage报告其大小高达144576 x 96480。imageRep像素大小为正确的2008x1340。选择最大的就这么多了。六羟甲基三聚氰胺六甲醚。。。