Попытка изменить размер NSImage, который превращается в NSData - PullRequest
4 голосов
/ 28 марта 2010

У меня есть NSImage, который я пытаюсь изменить размер так;

NSImage *capturePreviewFill = [[NSImage alloc] initWithData:previewData];
NSSize newSize;
newSize.height = 160;
newSize.width = 120;
[capturePreviewFill setScalesWhenResized:YES];
[capturePreviewFill setSize:newSize];

NSData *resizedPreviewData = [capturePreviewFill TIFFRepresentation]; 
resizedCaptureImageBitmapRep = [[NSBitmapImageRep alloc] initWithData:resizedPreviewData];
saveData = [resizedCaptureImageBitmapRep representationUsingType:NSJPEGFileType properties:nil];
[saveData writeToFile:@"/Users/ricky/Desktop/Photo.jpg" atomically:YES];

Моя первая проблема в том, что мое изображение становится раздавленным, когда я пытаюсь изменить его размер и не соответствовать соотношению сторон. Я читал, что использование -setScalesWhenResized решит эту проблему, но это не так.

Моя вторая проблема заключается в том, что когда я пытаюсь записать изображение в файл, размер изображения фактически не изменяется.

Спасибо заранее, Рикки.

Ответы [ 3 ]

10 голосов
/ 13 октября 2011

Я нашел этот пост очень полезным для изменения размера моего изображения: http://weblog.scifihifi.com/2005/06/25/how-to-resize-an-nsimage/

Вам нужно будет установить соотношение сторон на изображении, изменяя размер самостоятельно, это не будет сделано для вас. Вот как я это сделал, когда пытался разместить изображение в области печати на бумаге по умолчанию:

NSImage *image = ... // get your image
NSPrintInfo *printInfo = [NSPrintInfo sharedPrintInfo];
NSSize paperSize = printInfo.paperSize;
CGFloat usablePaperWidth = paperSize.width - printInfo.leftMargin - printInfo.rightMargin;
CGFloat resizeWidth = usablePaperWidth;
CGFloat resizeHeight = usablePaperWidth * (image.size.height / image.size.width);

Вот немного измененная версия его кода из блога:

NSData *sourceData = [image TIFFRepresentation];
float resizeWidth = ... // your desired width;
float resizeHeight = ... // your desired height;

NSImage *sourceImage = [[NSImage alloc] initWithData: sourceData];
NSImage *resizedImage = [[NSImage alloc] initWithSize: NSMakeSize(resizeWidth, resizeHeight)];

NSSize originalSize = [sourceImage size];

[resizedImage lockFocus];
[sourceImage drawInRect: NSMakeRect(0, 0, resizeWidth, resizeHeight) fromRect: NSMakeRect(0, 0, originalSize.width, originalSize.height) operation: NSCompositeSourceOver fraction: 1.0];
[resizedImage unlockFocus];

NSData *resizedData = [resizedImage TIFFRepresentation];

[sourceImage release];
[resizedImage release];
1 голос
/ 28 марта 2010

Если вам может потребоваться Mac OS X 10.6 или более поздняя версия, отправьте ваше изображение в виде CGImageForProposedRect:context:hints: сообщения , затем запишите CGImage, используя объект CGImageDestination .

Прямоугольник должен иметь в качестве источника NSZeroPoint, а его размер должен соответствовать желаемому размеру.

Это по-прежнему не будет пропорционально масштабировать изображение (поддерживая соотношение сторон); ты должен сделать это сам.

0 голосов
/ 28 марта 2010

Способ сделать это до 10.6 (без прохождения представления в формате TIFF) - заблокировать фокус на измененном изображении, создать NSBitmapImageRep для экстента изображения (то есть прямоугольник с нулевое происхождение и размер изображения), разблокируйте фокус, а затем запросите у представителя растрового изображения данные JPEG.

...