4

私はそのようにサイズを変更しようとしている 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 を使用するとこの問題は解決すると読みましたが、解決しませんでした。

2 つ目の問題は、画像をファイルに書き込もうとすると、実際には画像のサイズがまったく変更されないことです。

前もってありがとう、リッキー。

4

3 に答える 3

10

このブログ投稿は、画像のサイズを変更するのに非常に役立つことがわかりました: 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];
于 2011-10-13T00:23:48.300 に答える
1

Mac OS X 10.6 以降が必要な場合は、画像にCGImageForProposedRect:context:hints:メッセージを送信し、 CGImageDestinationオブジェクトを使用してCGImage を書き出します。

四角形は原点として NSZeroPoint を持ち、そのサイズは必要なサイズにする必要があります。

これはまだ画像を比例してスケーリングしません (アスペクト比を維持します)。あなたはそれを自分でしなければなりません。

于 2010-03-28T11:15:30.120 に答える
0

これを行う10.6より前の方法(TIFF表現を経由しない)は、サイズ変更された画像にフォーカスをロックし、画像の範囲(つまり、原点がゼロで画像のサイズがゼロの長方形)のNSBitmapImageRepを作成し、ロックを解除することです。焦点を合わせてから、そのビットマップ画像担当者に JPEG データを要求します。

于 2010-03-28T11:20:35.517 に答える