你必须非常小心 NSImage 的 size 属性。它不一定指的是 bitmapRepresentation 的像素尺寸,它可以指例如显示的大小。一个 NSImage 可能有许多 bitmapRepresentations 用于不同的输出大小。
同样,更改 NSImage 的 size 属性不会改变 bitmapRepresentations
所以你需要做的是计算出你想要输出图像的大小,然后使用来自源 NSImage 的 bitmapRepresentation 以该大小绘制一个新图像。
获得该大小取决于您如何获得输入图像以及您对它的了解。例如,如果您确信您的输入图像只有一个 bitmapImageRep,您可以使用这种类型的东西(作为 NSImage 上的一个类别)
- (NSSize) pixelSize
{
NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}
即使您有多个 bitmapImageRep,第一个应该是最大的,如果这是创建 Retina 图像的大小,那么它应该是您所追求的 Retina 大小。
计算出最终尺寸后,您可以制作图像:
- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size
{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = nil;
NSImageRep *sourceImageRep =
[sourceImage bestRepresentationForRect:targetFrame
context:nil
hints:nil];
targetImage = [[NSImage alloc] initWithSize:size];
[targetImage lockFocus];
[sourceImageRep drawInRect: targetFrame];
[targetImage unlockFocus];
return targetImage;
}
更新
这是 NSImage 上像素大小获取类别的更详细版本......让我们假设没有关于图像,它有多少 imageReps,它是否有任何bitmapImageReps......这将返回它可以找到的最大像素尺寸. 如果它找不到 bitMapImageRep 像素尺寸,它将使用它可以得到的任何其他东西,这很可能是边界框尺寸(由 eps 和 pdf 使用)。
NSImage+PixelSize.h
#import <Cocoa/Cocoa.h>
#import <QuartzCore/QuartzCore.h>
@interface NSImage (PixelSize)
- (NSInteger) pixelsWide;
- (NSInteger) pixelsHigh;
- (NSSize) pixelSize;
@end
NSImage+PixelSize.m
#import "NSImage+PixelSize.h"
@implementation NSImage (Extensions)
- (NSInteger) pixelsWide
{
/*
returns the pixel width of NSImage.
Selects the largest bitmapRep by preference
If there is no bitmapRep returns largest size reported by any imageRep.
*/
NSInteger result = 0;
NSInteger bitmapResult = 0;
for (NSImageRep* imageRep in [self representations]) {
if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
if (imageRep.pixelsWide > bitmapResult)
bitmapResult = imageRep.pixelsWide;
} else {
if (imageRep.pixelsWide > result)
result = imageRep.pixelsWide;
}
}
if (bitmapResult) result = bitmapResult;
return result;
}
- (NSInteger) pixelsHigh
{
/*
returns the pixel height of NSImage.
Selects the largest bitmapRep by preference
If there is no bitmapRep returns largest size reported by any imageRep.
*/
NSInteger result = 0;
NSInteger bitmapResult = 0;
for (NSImageRep* imageRep in [self representations]) {
if ([imageRep isKindOfClass:[NSBitmapImageRep class]]) {
if (imageRep.pixelsHigh > bitmapResult)
bitmapResult = imageRep.pixelsHigh;
} else {
if (imageRep.pixelsHigh > result)
result = imageRep.pixelsHigh;
}
}
if (bitmapResult) result = bitmapResult;
return result;
}
- (NSSize) pixelSize
{
return NSMakeSize(self.pixelsWide,self.pixelsHigh);
}
@end
您将#import "NSImage+PixelSize.h"
在当前文件中使其可访问。
使用此图像类别和 resize: 方法,您将修改您的方法:
//size.width = inputRetinaImage.size.width*0.5;
//size.height = inputRetinaImage.size.height*0.5;
size.width = inputRetinaImage.pixelsWide*0.5;
size.height = inputRetinaImage.pixelsHigh*0.5;
//[inputRetinaImage setSize:size];
NSImage* outputImage = [self resizeImage:inputRetinaImage size:size];
//NSBitmapImageRep *imgRep = [[inputRetinaImage representations] objectAtIndex: 0];
NSBitmapImageRep *imgRep = [[outputImage representations] objectAtIndex: 0];
那应该为您解决问题(附带条件:我尚未在您的代码上对其进行测试)