NSImageのサイズ属性には十分注意する必要があります。必ずしもbitmapRepresentationのピクセル寸法を参照する必要はありません。たとえば、表示されるサイズを参照する場合があります。NSImageには、さまざまな出力サイズで使用するための多数のbitmapRepresentationsが含まれる場合があります。
同様に、NSImageのsize属性を変更しても、bitmapRepresentationsは変更されません。
したがって、必要なのは、出力画像のサイズを決定し、ソースNSImageのbitmapRepresentationを使用してそのサイズで新しい画像を描画することです。
そのサイズを取得することは、入力画像をどのように取得したか、そしてそれについて何を知っているかによって異なります。たとえば、入力画像にbitmapImageRepが1つしかないことが確実な場合は、このタイプのものを(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
{
/*
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];
それはあなたのために物事を修正するはずです(但し書き:私はあなたのコードでそれをテストしていません)