size
NSImage のプロパティは、画像表現のピクセル寸法との間接的な関係しか持たないため、使用できません。ピクセルのサイズを変更する良い方法は、 NSImageRepdrawInRect
のメソッドを使用することです:
- (BOOL)drawInRect:(NSRect)rect
指定された四角形にイメージ全体を描画し、必要に応じてサイズを調整します。
これは画像のサイズ変更方法です (必要なピクセル サイズで新しい NSImage を作成します)。
- (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 doesn't scale
動作する別のサイズ変更方法は NSImage メソッドですdrawInRect:fromRect:operation:fraction:respectFlipped:hints
- (void)drawInRect:(NSRect)dstSpacePortionRect
fromRect:(NSRect)srcSpacePortionRect
operation:(NSCompositingOperation)op
fraction:(CGFloat)requestedAlpha
respectFlipped:(BOOL)respectContextIsFlipped
hints:(NSDictionary *)hints
この方法の主な利点は、hints
補間をある程度制御できる NSDictionary です。これにより、画像を拡大すると、大きく異なる結果が得られる可能性があります。NSImageHintInterpolation
は、5 つの値のいずれかを取ることができる列挙型です…</p>
enum {
NSImageInterpolationDefault = 0,
NSImageInterpolationNone = 1,
NSImageInterpolationLow = 2,
NSImageInterpolationMedium = 4,
NSImageInterpolationHigh = 3
};
typedef NSUInteger NSImageInterpolation;
このメソッドを使用すると、imageRep を抽出する中間ステップは必要ありません。NSImage は正しいことを行います...
- (NSImage*) resizeImage:(NSImage*)sourceImage size:(NSSize)size
{
NSRect targetFrame = NSMakeRect(0, 0, size.width, size.height);
NSImage* targetImage = [[NSImage alloc] initWithSize:size];
[targetImage lockFocus];
[sourceImage drawInRect:targetFrame
fromRect:NSZeroRect //portion of source image to draw
operation:NSCompositeCopy //compositing operation
fraction:1.0 //alpha (transparency) value
respectFlipped:YES //coordinate system
hints:@{NSImageHintInterpolation:
[NSNumber numberWithInt:NSImageInterpolationLow]}];
[targetImage unlockFocus];
return targetImage;
}