objective-c - 如何在Objective-C中将字节数组转换为图像

标签 objective-c uiimage bytearray

就是这种情况
我有一个未签名的char指针指向BMP图像数据
在我用指针循环后,我实现了一个包含int值0-255的字节数组

我想要的是将数组中的此值转换为BMP图像
在UIImage中显示它。

**图像为灰度

最佳答案

此代码段来自blog,我建议您在那里查看project site in Github

另请注意,此类方法适用于RGB8图像,因此您需要在bitsPerPixel(灰度应该为8),bytesPerRow(1 *宽度),bufferLength(删除* 4),并改为使用colorSpaceRef创建CGColorCreateGenericGray

我还注意到,使用CGColorCreateGenericGray创建色彩空间时假设您的数组具有alpha信息。因此,也许您应该为每个像素添加一个alpha字节,以使其正常工作。

+ (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer 
            withWidth:(int) width
           withHeight:(int) height {


    size_t bufferLength = width * height * 4;
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, 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;
}

关于objective-c - 如何在Objective-C中将字节数组转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7650144/

相关文章:

ios - 检测 UIInputViewController 子类中的旋转。键盘扩展

objective-c - 自动释放对象的保留计数何时递减?

iphone - 将 NSString 转换为 NSNumber

swift - UIImageView 的 If 语句

ios - 保存 UIImage 的缩略图会横向/上下翻转图像

Android - 从 byte[] 数组播放 mp3

objective-c - NSMutableData 是如何分配内存的?

c# - Java和C#——字节数组到长转换的区别

actionscript-3 - AS3:提取的sampledata循环永远到最后一 block

iOS Swift - 在 UIImage 上画线以保存到文件