iOS:创建UIImage时出现CGBitmapContextCreate错误

时间:2012-08-03 22:41:08

标签: ios

我想从Pix获取UIImage而不对文件操作进行任何读/写操作。我收到了CGBitmapContextCreate错误。

这是Pix结构:

    struct Pix
{
     l_uint32             w;           /* width in pixels                   */
     l_uint32             h;           /* height in pixels                  */
     l_uint32             d;           /* depth in bits                     */
     l_uint32             wpl;         /* 32-bit words/line                 */
     l_uint32             refcount;    /* reference count (1 if no clones)  */
     l_int32              xres;        /* image res (ppi) in x direction    */
                                       /* (use 0 if unknown)                */
     l_int32              yres;        /* image res (ppi) in y direction    */
                                       /* (use 0 if unknown)                */
     l_int32              informat;    /* input file format, IFF_*          */
     char                *text;        /* text string associated with pix   */
     struct PixColormap  *colormap;    /* colormap (may be null)            */
     l_uint32            *data;        /* the image data                    */
 };
 typedef struct Pix PIX;

完整文档可在此处找到:http://tpgit.github.com/Leptonica/pix_8h_source.html

这是我的尝试:

- (UIImage *) getImageFromPix:(PIX *) thePix
{
    CGColorSpaceRef colorSpace;
    uint32_t *bitmapData;

    size_t bitsPerComponent = thePix->d;

    size_t width = thePix->w;
    size_t height = thePix->h;

    size_t bytesPerRow = thePix->wpl * 4;

    colorSpace = CGColorSpaceCreateDeviceGray();

    if(!colorSpace) {
        NSLog(@"Error allocating color space Gray\n");
        return NULL;
    }

    // Allocate memory for image data
    bitmapData = thePix->data;

    if(!bitmapData) {
        NSLog(@"Error allocating memory for bitmap\n");
        CGColorSpaceRelease(colorSpace);
        return NULL;
    }

    //Create bitmap context

    CGContextRef context = CGBitmapContextCreate(bitmapData, 
                                    width, 
                                    height, 
                                    bitsPerComponent, 
                                    bytesPerRow, 
                                    colorSpace, 
                                    kCGImageAlphaNone); 
    if(!context) {
        free(bitmapData);
        NSLog(@"Bitmap context not created");
    }

    CGColorSpaceRelease(colorSpace);

    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    UIImage * result = [UIImage imageWithCGImage:imgRef];
    CGImageRelease(imgRef);
    CGContextRelease(context);

    return result;
}

这是我得到的错误:

<Error>: CGBitmapContextCreate: unsupported parameter combination: 1 integer bits/component; 1 bits/pixel; 1-component color space; kCGImageAlphaNone; 16 bytes/row.

1 个答案:

答案 0 :(得分:2)

CGBitmapContextCreate()不支持像素格式的每种组合。可能有许多不支持的Pix格式。可以在Quartz 2D Programming Guide中找到支持格式的完整列表。 iOS上支持的格式相当有限。您可能需要将从Pix获得的内容转换为支持的格式之一。一般来说很难做到这一点但是对于你的具体情况,如果你总是得到1位/像素,1位/分量,没有 alpha通道,它不应该太难转换为8位/像素的灰色格式,8位/分量,iOS上不支持alpha通道。