Увеличьте масштаб NSImage и сохраните

Я хотел бы увеличить изображение размером 64 пикселя, чтобы сделать его 512 пикселей (даже если оно размыто или пикселизировано)

Я использую это, чтобы получить изображение из моего 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: но он все равно сохраняет 64 пикселя.

Заранее спасибо!


person atomikpanda    schedule 23.03.2013    source источник


Ответы (1)


Вы не можете использовать свойство size NSImage, поскольку оно имеет только косвенную связь с размерами представления изображения в пикселях. Хороший способ изменить размеры в пикселях — использовать метод drawInRect из NSImageRep:

 - (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 не масштабируется

Другой работающий метод изменения размера — это метод 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 — это перечисление, которое может принимать одно из пяти значений…

    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;
}
person foundry    schedule 23.03.2013
comment
Спасибо, это было именно то, что мне было нужно! - person atomikpanda; 24.03.2013
comment
Этот ответ - золото для меня. :) Большое спасибо! - person Git.Coach; 07.09.2013