【问题标题】:Trying to resize an NSImage which turns into NSData试图调整变成 NSData 的 NSImage 的大小
【发布时间】:2010-03-28 03:39:04
【问题描述】:

我有一个 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 可以解决这个问题,但它没有。

我的第二个问题是,当我尝试将图像写入文件时,图像实际上根本没有调整大小。

提前致谢, 瑞奇。

【问题讨论】:

  • 您正在将saveData 写入文件。它来自哪里?
  • setScalesWhenResized: 不会改变处理纵横比的方式。相反,它强制每个NSImageRep 在下一次调用setSize: 时重新调整其内容。此外,它在 10.6 中已弃用。

标签: cocoa nsdata nsimage


【解决方案1】:

我发现这篇博文对调整图片大小很有帮助: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];

【讨论】:

  • 花了几天时间试图弄清楚这一点。感谢您分享这个效果很好!
【解决方案2】:

如果您需要 Mac OS X 10.6 或更高版本,send your image a CGImageForProposedRect:context:hints: message,然后使用 CGImageDestination 对象写出 CGImage。

矩形应该以 NSZeroPoint 作为它的原点,并且它的大小是你想要的大小。

这仍然不会按比例缩放图像(保持纵横比);你必须自己做。

【讨论】:

  • 我之前没有真正做过任何 CG 工作。如果它不能按比例缩放图像,那我为什么要使用它?好像和 NSImage 的 -setSize 一样
  • 您正在使用它(或其他解决方案)来缩放图像。这样做按比例由您决定。 Cocoa 没有提供按比例缩放图像的方法,除了仅在显示中(在图像视图中)。
【解决方案3】:

10.6 之前的方法(不通过 TIFF 表示)是将焦点锁定在调整大小的图像create an NSBitmapImageRep for the extent of the image(即,原点和图像大小为零的矩形)上,解锁焦点,然后然后向该位图图像代表询问 JPEG 数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多