在处理NSImage的大小属性时,必须非常小心。它并不一定指的是bitmapRepresentation的像素尺寸,例如它可能指的是显示尺寸。一个NSImage可能有多个bitmapRepresentations,用于不同的输出尺寸。
同样地,改变NSImage的大小属性对bitmapRepresentations没有任何影响。
因此,您需要确定您想要的输出图像的大小,然后使用源NSImage中的bitmapRepresentation在该大小上绘制新图像。
获取该大小取决于您如何获取输入图像以及您所知道的内容。例如,如果您确信您的输入图像只有一个bitmapImageRep,则可以使用此类型的东西(作为NSImage的类别)
- (NSSize) pixelSize
{
NSBitmapImageRep* bitmap = [[self representations] objectAtIndex:0];
return NSMakeSize(bitmap.pixelsWide,bitmap.pixelsHigh);
}
即使您有多个bitmapImageReps,第一个也应该是最大的,如果这是创建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
{
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
{
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];
这应该为您解决问题(附条件:我没有在您的代码上测试过)
setScalesWhenResized:
。这曾经是您实现此功能的方法,但自从Snow Leopard以来已被弃用,并且在Lion中不起作用。 - Peter Hosey