Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos N图片大小不是一些图片的真实大小?_Macos_Cocoa_Core Graphics_Nsimage - Fatal编程技术网

Macos N图片大小不是一些图片的真实大小?

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的大小不是真实的大小(有些图片),而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);
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。选择最大的就这么多了。六羟甲基三聚氰胺六甲醚。。。