2

64px の画像を 512px に拡大したい (ぼやけていたりピクセル化されている場合でも)

これを使用して、NSImageView から画像を取得し、保存しています。

NSData *customimageData = [[customIcon image] TIFFRepresentation];
    NSBitmapImageRep *customimageRep = [NSBitmapImageRep imageRepWithData:customimageData];


    customimageData = [customimageRep representationUsingType:NSPNGFileType properties:nil];



    NSString* customBundlePath = [[NSBundle mainBundle] pathForResource:@"customIcon" ofType:@"png"];
    [customimageData writeToFile:customBundlePath atomically:YES];

setSize: を試しましたが、それでも 64px で保存されます。

前もって感謝します!

4

1 に答える 1

11

sizeNSImage のプロパティは、画像表現のピクセル寸法との間接的な関係しか持たないため、使用できません。ピクセルのサイズを変更する良い方法は、 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;
}
于 2013-03-23T16:18:30.993 に答える