首页 文章

如何使用原始ARGB数据创建颜色位图(CGBitmapContextCreate)

提问于
浏览
0

我得到一个图像,但我失去了1个字节 . 我的结果图像:

enter image description here

我想使用argb raw (void*)data 创建color / rgba位图,我有它的宽度和高度 . 在后端(c)我有 decoded rgb to argb 使用以下方法,然后给 input as (void)pData* ,

void decode_rgb_to_argb(U8Data r, U8Data g, U8Data b, U32Data argb, u_int elements)
{
 assert(argb);
 assert(r);
 assert(g);
 assert(b);
 assert(elements);     

 unsigned char*p=NULL;

 for(u_int i=0;i<elements;i++)
 {
      p=(unsigned char*)(argb+i);
      *p=b[i];
      p++;
      *p=g[i];
      p++;
      *p=r[i];
      p++;
      *p=0;
 }
}
pData = decode_rgb_to_argb;

//I am handling in ios

-(uiimage*) createBitmap:(void*)pData pWidth:(u_int)pWidth pHeight:(u_int)pHeight{

   // Here i want to write ppm file using pData to check wether 4byte/3byte.
   NSData* data = [NSData dataWithBytes:pData  length:pWidth*pHeight];

     char* myBuffer = (char*)pData;
    char* rgba = (char*)malloc(pWidth*pHeight*4);

    for(int i=0; i < pWidth*pHeight; i++) {
    rgba[4*i] = myBuffer[3*i];
    rgba[4*i+1] = myBuffer[3*i+1];
    rgba[4*i+2] = myBuffer[3*i+2];
    rgba[4*i+3] = 255; //or 0
   }


size_t bitsPerComponent = 8;
size_t bytesPerRow      = pWidth*4;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef bitmapContext = CGBitmapContextCreate(
 // Here i have given my raw data(pData) and rgba buffer
                                                   (u_char*)pData,
                                                   pWidth,
                                                   pHeight,
                                                   bitsPerComponent,
                                                   bytesPerRow,
                                                   colorSpace,
   //Here i have used kCGImageAlphaFirst because i am getting data as ARGB,but
   //bitmap is not creating.If i use kCGImageAlphaNoneSkipLast, i am getting expected
   //image but i'm loosing one byte(alpha).
                                                   kCGImageAlhaInfo       
                                                   );

CFRelease(colorSpace);

CGImageRef cgImage = CGBitmapContextCreateImage(bitmapContext);
UIImage *result = [[[UIImage imageWithCGImage:cgImage] retain] autorelease];

CGColorSpaceRelease(colorSpace);
CGImageRelease(cgImage);
CGContextRelease(bitmapContext);
return result;

}

如何编写ppm文件,如何从原始 (void*)Pdata 创建位图到ios中的彩色图像?

1 回答

  • 0

    如果你需要一个带有rgb的uiimage然后你可以使用这个功能 .

    - (UIImage *) createImageWithRGBColor :(UIColor *)color ofSize : (CGSize)Size {
        UIView *keyview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, Size.width, Size.height)];
        [keyview setBackgroundColor:color];
        CGRect rect = [keyview bounds];
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [keyview.layer renderInContext:context];
        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return img;
    }
    

    并且这样打电话:

    UIImage *image = [self createImageWithRGBColor:[UIColor colorWithRed:.25f green:.40f blue:.8f alpha:1.0] ofSize:CGSizeMake(100, 100)];
    

相关问题