【问题标题】:Handling various types of Bitmaps in iOS在 iOS 中处理各种类型的位图
【发布时间】:2014-09-19 00:25:22
【问题描述】:

ios-converting-uiimage-to-rgba8-bitmaps-and-back 是我发现的一篇非常好的文章,它描述了我们如何处理位图缓冲区和 UIImages。本文处理 RGBA32/RGBA8 位图图像。位图图像是用 char * buffer 创建的,大小为 width * height * 4。即每个像素信息将有 4 个字节的数据,每个 1 个字节分别用于存储红色、绿色、蓝色和 alpha。在创建位图图像时,会给出位图信息“kCGImageAlphaPremultipliedLast”。 CGColorSpaceCreateDeviceRGB() 用于将位图缓冲区转换回 UIImage。通过更改位图信息,我们还可以处理 RGBA 24 图像。 我需要处理 RGBA 5551 位图图像。红色、绿色和蓝色的颜色被赋予 5 位来表示相应的颜色,而 1 位用于存储 alpha 值。如果我们正在创建这样的位图,我们如何为 char * 位图分配缓冲区。是否可以转换为 UIImage 数据类型?任何帮助将不胜感激。

【问题讨论】:

  • 获取 David Gelphman 和 Bunny Laden 的 Programming with Quartz 副本。最接近的格式可能是:kCGImageAlphaNoneSkipFirst`,这是一个 XRGB,每种颜色有 5 位(XRGB 1555)。也许您可以将前导位设置为您的 Alpha 值。
  • @Zaph 我已经使用 XRGB 转换了字符缓冲区,我正在获取 UIImage 对象并使用 ImageView 完美呈现。但是我得到的字符缓冲区是 RGB 5551 类型的。实际图像颜色与我使用 XRGB 转换的颜色不匹配(kCGImageAlphaNoneSkipFirst 位图信息)。您能否建议任何解决方案,例如将 5551 rgb 缓冲区转换为 1555 rg 缓冲区或 iOS sdk 中支持的任何其他类型。
  • 如果需要,交换缓冲区中的位,只需使用“C”位移,and and or 操作。

标签: ios objective-c bitmap uiimage


【解决方案1】:

这里的 BITS_PER_COMPONENT 是 5,BITS_PER_COMPONENT 是 16。有了这个代码,我成功了。 kCGBitmapByteOrder16Little 表示 char 缓冲区的字节顺序。

size_t bufferLength = width * height * 2;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLength, NULL);
size_t bitsPerComponent = BITS_PER_COMPONENT;
size_t bitsPerPixel = BITS_PER_PIXEL;
size_t bytesPerRow = 2 * width;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
if(colorSpaceRef == NULL) {
    NSLog(@"Error allocating color space");
    CGDataProviderRelease(provider);
    return nil;
}
CGBitmapInfo bitmapInfo = kCGBitmapByteOrder16Little | kCGImageAlphaNoneSkipFirst;
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);

【讨论】:

    【解决方案2】:

    您需要创建 16 位图像,所以提供 bpp 为 16,bpc 为 5,代码如下:

    size_t width = CGImageGetWidth(screenShotImageRef);
    size_t height = CGImageGetHeight(screenShotImageRef);
    size_t bytesPerRow = width * (bpc == 5 ? 2 : 4);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(buffer(provide buffer where you want to write image into), width, height, bpc, bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrderDefault);
    CGContextDrawImage(bitmapContext, CGRectMake(0, 0, width, height), screenShotImageRef);
    CGContextRelease(bitmapContext);
    CGColorSpaceRelease(colorSpace);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-08
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      相关资源
      最近更新 更多