如何在Core Graphics中生成RGBA图像?

Ian*_*ell 7 iphone opengl-es core-graphics objective-c

我正在尝试从文本生成RGBA8图像以用作OpenGL ES 2.0纹理.

+(UIImage *)imageFromText:(NSString *)text
{
  UIFont *font = [UIFont systemFontOfSize:20.0];  
  CGSize size  = [text sizeWithFont:font];

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef contextRef =  CGBitmapContextCreate (NULL,
                                                    size.width, size.height,
                                                    8, 4*size.width,
                                                    colorSpace,
                                                    kCGImageAlphaLast
                                                    );
  CGColorSpaceRelease(colorSpace);
  UIGraphicsPushContext(contextRef);

  [text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font];
  UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

  UIGraphicsPopContext();

  return image;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有CGColorSpaceCreateDeviceRGBA,CGColorSpaceCreateDeviceRGB导致以下错误:

CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 448 bytes/row.
Run Code Online (Sandbox Code Playgroud)

我缺少什么来创建OpenGL想要的正确RGBA8格式?

更新:我更改了CGBitmapContextCreatefrom 的最后一个参数kCGImageAlphaNone(当我复制粘贴代码时)kCGImageAlphaLast,这是我错误尝试的几种变体之一.

更新2:UIGraphicsGetImageFromCurrentImageContext()如果未创建上下文,则返回nil UIGraphicsBeginImageContext(),因此有必要以不同方式提取图像:[UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)].

NSG*_*God 14

您在创建过程中指定的颜色空间不会导致类似的错误.

你得到这个错误的原因是你为每个组件指定了8位,可能是4*size.width你传入的值中有4个颜色分量bytesPerRow,但bitmapInfo参数是kCGImageAlphaNone.kCGImageAlphaNone只是意味着RGB,不是RGBA.如果您愿意RGBA,您应该最有可能指定.kCGImageAlphaLast kCGImageAlphaPremultipliedLast

[编辑]抱歉.我应该说kCGImageAlphaPremultipliedLast,不是kCGImageAlphaLast.

所以,像这样:

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef contextRef =  CGBitmapContextCreate(NULL,
                                                 size.width,
                                                 size.height,
                                                 8,
                                                 4 * size.width,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast);
Run Code Online (Sandbox Code Playgroud)