Load NSImage into QPixmap or QImage

c++, graphics, macos, qt

Solution

`NSImage` is a high level image wrapper that might contain more than one image (thumbnails, different resolutions, vector representations, ...) and does a lot of caching magic. A `CGImage` on the other hand is one plain bitmap image. Since `NSImage` is a so much richer object, there’s no easy way of converting in between the two.

To get a `CGImageRef` from an NSImage you have some options:

- Manually select an `NSBitmapImageRep` from the `NSImage` (using `[img representations]`) and get the `CGImage` from that.

- Setup a graphics context (`CGBitmapContextCreate`), draw the image into that, and create a `CGImage` from this context.

- Use the new Snow Leopard API to create the `CGImage` directly from the `NSImage`: `[img CGImageForProposedRect:NULL context:nil hints:nil]`

Problem

I have an NSImage pointer from a platform SDK, and I need to load it into Qt's QImage class. To make things easier, I can create a QImage from a CGImageRef by using QPixmap as an intermediate format, like this: ``` CGImageRef myImage = // ... get a CGImageRef somehow. QImage img = QPixmap::fromMacCGImageRef(myImage).toImage(); ``` However, I cannot find a way to convert from an NSImage to a CGImageRef. Several other people have had the same problem, but I have yet to find a solution. There is the `CGImageForProposedRect` method, but I can't seem to get it to work. I'm currently trying this (`img` is my NSImage ptr): ``` CGImageRef ir = [img CGImageFirProposedRect:0:0:0]; ``` Any ideas?

Original source