CGImage from byte array

后端 未结 3 1644
栀梦
栀梦 2020-12-05 02:58

Loading a CGImage or NSImage from a file using a standard image format (jpeg, gif, png et.) is all very simple.

However, I now need to create a CGImage from an arra

相关标签:
3条回答
  • 2020-12-05 03:41

    Using CFData can make the above code simpler. Here is the code.

    // raw pixel data memory of 64 * 64 pixel size
    
    UInt8 pixelData[64 * 64 * 3];
    
    // fill the raw pixel buffer with arbitrary gray color for test
    
    for(size_t ui = 0; ui < 64 * 64 * 3; ui++)
      pixelData[ui] = 210;
    
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    
    CFDataRef rgbData = CFDataCreate(NULL, pixelData, 64 * 64 * 3);
    
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(rgbData);
    
    CGImageRef rgbImageRef = CGImageCreate(64, 64, 8, 24, 64 * 3, colorspace, kCGBitmapByteOrderDefault, provider, NULL, true, kCGRenderingIntentDefault); 
    
    CFRelease(rgbData);
    
    CGDataProviderRelease(provider);
    
    CGColorSpaceRelease(colorspace);
    
    // use the created CGImage
    
    CGImageRelease(rgbImageRef);
    
    0 讨论(0)
  • 2020-12-05 03:42

    Old question, but still useful! Swift 4 equivalent of chansuk park's answer:

    let height = 64
    let width = 64
    let numComponents = 3
    let numBytes = height * width * numComponents
    let pixelData = [UInt8](repeating: 210, count: numBytes)
    let colorspace = CGColorSpaceCreateDeviceRGB()
    let rgbData = CFDataCreate(nil, pixelData, numBytes)!
    let provider = CGDataProvider(data: rgbData)!
    let rgbImageRef = CGImage(width: width,
                              height: height,
                              bitsPerComponent: 8,
                              bitsPerPixel: 8 * numComponents,
                              bytesPerRow: width * numComponents,
                              space: colorspace,
                              bitmapInfo: CGBitmapInfo(rawValue: 0),
                              provider: provider,
                              decode: nil,
                              shouldInterpolate: true,
                              intent: CGColorRenderingIntent.defaultIntent)!
    // Do something with rgbImageRef, or for UIImage:
    let outputImage = UIImage(cgImage: rgbImageRef)
    
    0 讨论(0)
  • 2020-12-05 03:44

    You can create a CGDataProvider, and let CG request the necessary data from your provider, instead of writing to an image buffer.

    Here's a very simple example that generates a black CGImage of size 64x64.

    CGDataProviderSequentialCallbacks callbacks;
    callbacks.getBytes = getBytes;
    
    CGDataProviderRef provider = CGDataProviderCreateSequential(NULL, &callbacks);
    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGImageRef img = CGImageCreate(64,                         // width
                                   64,                         // height
                                   8,                          // bitsPerComponent
                                   24,                         // bitsPerPixel
                                   64*3,                       // bytesPerRow
                                   space,                      // colorspace
                                   kCGBitmapByteOrderDefault,  // bitmapInfo
                                   provider,                   // CGDataProvider
                                   NULL,                       // decode array
                                   NO,                         // shouldInterpolate
                                   kCGRenderingIntentDefault); // intent
    
    CGColorSpaceRelease(space);
    CGDataProviderRelease(provider);
    
    // use the created CGImage
    
    CGImageRelease(img);
    

    and getBytes is defined like this:

    size_t getBytes(void *info, void *buffer, size_t count) {
        memset(buffer, 0x00, count);
        return count;
    }
    

    of course, you will want to implement the other callbacks (skipForward, rewind, releaseInfo), and use a proper structure or object for info.

    For more information, check out the CGImage and CGDataProvider references.

    0 讨论(0)
提交回复
热议问题