将 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 中的主要内容,如果未能解决你的问题,请参考以下文章

将 NSImage 保存到路径不起作用

从 CoreData 检索 NSImage - Mac OS X

QT Q Image QPixmap ·QBitmap 三者区别

PyQt5组件之QPixmap

使用 QPixmap 加载图像

使用IBDesignable以编程方式从Assets访问NSImage