将 NSImage 加载到 QPixmap 或 QImage 中
Posted
技术标签:
【中文标题】将 NSImage 加载到 QPixmap 或 QImage 中【英文标题】:Load NSImage into QPixmap or QImage 【发布时间】:2010-03-18 09:55:06 【问题描述】:我有一个来自平台 SDK 的 NSImage 指针,我需要将它加载到 Qt 的 QImage 类中。为了方便起见,我可以使用 QPixmap 作为中间格式,从 CGImageRef 创建 QImage,如下所示:
CGImageRef myImage = // ... get a CGImageRef somehow.
QImage img = QPixmap::fromMacCGImageRef(myImage).toImage();
但是,我找不到将 NSImage 转换为 CGImageRef 的方法。 Severalother people也遇到过同样的问题,但是我还没有找到解决办法。
有CGImageForProposedRect
方法,但我似乎无法让它工作。我目前正在尝试这个(img
是我的 NSImage 指针):
CGImageRef ir = [img CGImageFirProposedRect:0:0:0];
有什么想法吗?
【问题讨论】:
【参考方案1】:NSImage
是一个高级图像包装器,它可能包含多个图像(缩略图、不同分辨率、矢量表示...),并具有很多缓存功能。另一方面,CGImage
是一个普通的位图图像。由于NSImage
是一个非常丰富的对象,因此没有简单的方法可以在两者之间进行转换。
要从 NSImage 中获取 CGImageRef
,您有一些选择:
-
从
NSImage
中手动选择NSBitmapImageRep
(使用[img representations]
)并从中获取CGImage
。
设置图形上下文 (CGBitmapContextCreate
),将图像绘制到其中,然后从该上下文创建 CGImage
。
使用新的 Snow Leopard API 直接从NSImage
创建CGImage
:[img CGImageForProposedRect:NULL context:nil hints:nil]
【讨论】:
【参考方案2】:// Sample to create 16x16 QPixmap with alpha channel using Cocoa
const int width = 16;
const int height = 16;
NSBitmapImageRep * bmp = [[NSBitmapImageRep alloc]
initWithBitmapDataPlanes:NULL
pixelsWide:width
pixelsHigh:height
bitsPerSample:8
samplesPerPixel:4
hasAlpha:YES
isPlanar:NO
colorSpaceName:NSDeviceRGBColorSpace
bitmapFormat:NSAlphaFirstBitmapFormat
bytesPerRow:0
bitsPerPixel:0
];
[NSGraphicsContext saveGraphicsState];
[NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithBitmapImageRep:bmp]];
// assume NSImage nsimage
[nsimage drawInRect:NSMakeRect(0,0,width,height) fromRect:NSZeroRect operation: NSCompositeSourceOver fraction: 1];
[NSGraphicsContext restoreGraphicsState];
QPixmap qpixmap = QPixmap::fromMacCGImageRef([bmp CGImage]);
[bmp release];
【讨论】:
以上是关于将 NSImage 加载到 QPixmap 或 QImage 中的主要内容,如果未能解决你的问题,请参考以下文章
从 CoreData 检索 NSImage - Mac OS X