iOS/Objective C: 将RGB数据转换为UIImage

4
我需要帮助将一个24/32位RGB原始图像转换为UIImage。
我已经尝试了Paul Solt和其他人在这里提供的示例,但是什么都不起作用。请问有谁可以提供一个示例或教程吗?
图像数据保存在NSData中,我想要一个jpg或png格式的图像。
谢谢。 Thorsten
我正在使用Paul Solt编写的代码,它确实做了一些事情,但是图像看起来好像包含了四倍的图像信息。我无法在此处发布图像: 编辑:我添加了方法开头之间的行,现在它可以工作了 :-)
+ (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer
                                withWidth:(int) width
                               withHeight:(int) height {

    // added code
    char* rgba = (char*)malloc(width*height*4);
    for(int i=0; i < width*height; ++i) {
        rgba[4*i] = buffer[3*i];
        rgba[4*i+1] = buffer[3*i+1];
        rgba[4*i+2] = buffer[3*i+2];
        rgba[4*i+3] = 255;
    }
    // 


    size_t bufferLength = width * height * 4;
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rgba, bufferLength, NULL);
    size_t bitsPerComponent = 8;
    size_t bitsPerPixel = 32;
    size_t bytesPerRow = 4 * width;

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    if(colorSpaceRef == NULL) {
        NSLog(@"Error allocating color space");
        CGDataProviderRelease(provider);
        return nil;
    }

    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    CGImageRef iref = CGImageCreate(width,
                                    height,
                                    bitsPerComponent,
                                    bitsPerPixel,
                                    bytesPerRow,
                                    colorSpaceRef,
                                    bitmapInfo,
                                    provider,   // data provider
                                    NULL,       // decode
                                    YES,            // should interpolate
                                    renderingIntent);

    uint32_t* pixels = (uint32_t*)malloc(bufferLength);

    if(pixels == NULL) {
        NSLog(@"Error: Memory not allocated for bitmap");
        CGDataProviderRelease(provider);
        CGColorSpaceRelease(colorSpaceRef);
        CGImageRelease(iref);
        return nil;
    }

    CGContextRef context = CGBitmapContextCreate(pixels,
                                                 width,
                                                 height,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpaceRef,
                                                 bitmapInfo);

    if(context == NULL) {
        NSLog(@"Error context not created");
        free(pixels);
    }

    UIImage *image = nil;
    if(context) {

        CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref);

        CGImageRef imageRef = CGBitmapContextCreateImage(context);

        // Support both iPad 3.2 and iPhone 4 Retina displays with the correct scale
        if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {
            float scale = [[UIScreen mainScreen] scale];
            image = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];
        } else {
            image = [UIImage imageWithCGImage:imageRef];
        }

        CGImageRelease(imageRef);   
        CGContextRelease(context);  
    }

    CGColorSpaceRelease(colorSpaceRef);
    CGImageRelease(iref);
    CGDataProviderRelease(provider);

    if(pixels) {
        free(pixels);
    }   
    return image;
}

请发布一些代码...并说明您尝试过什么。 - Arun
请查看以下链接:https://dev59.com/gF7Va4cB1Zd3GeqPNde-?rq=1 - Arun
你指的“原始数据”到底是什么意思?是指生产商特定的相机RAW格式,还是仅指RGB位图数据? - Hermann Klecker
我正在尝试连接扫描仪。扫描仪以“预览”数据的形式发送“彩色RGB原始数据”。这就是我所拥有的所有信息。 - thorb65
请查看此链接,它可能会对您有所帮助:https://dev59.com/u3I-5IYBdhLWcg3w-92b - Divyam shukla
@DivZ... 添加 alpha 通道的第一行代码就完成了魔法 :-) 谢谢 - thorb65
2个回答

4

解决方案:

我的位图图像数据只有三个字节,但iOS需要四个字节,第四个字节是用于表示透明度的。因此插入下列代码以添加第四个字节可以解决问题。

char* rgba = (char*)malloc(width*height*4);
for(int i=0; i < width*height; ++i) {
    rgba[4*i] = buffer[3*i];
    rgba[4*i+1] = buffer[3*i+1];
    rgba[4*i+2] = buffer[3*i+2];
    rgba[4*i+3] = 255;
}

1
kCGImageAlphaNone 这将解决你的问题。 - André Abreu

-2

这是NSData到UIImage的转换:

NSData *imageData = UIImagePNGRepresentation(image);

UIImage *image=[UIImage imageWithData:data];

我使用了这段代码创建了PNG图像,希望它对你也有用。

抱歉,它不支持PNG格式。正如我所写的,我没有PNG表示。数据是原始的RGB 24/32位。但还是谢谢 :-) - thorb65

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接