Вы не можете использовать свойство 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