一直没在sdk的api中发现有比较简便直观的取得CGimage字节数据的方法,自己曾经在这上面来来去去花了不少时间,有时实现了,但没有做相关总结,下次使用时又忘记,又重新捣鼓一遍,浪费经历和时间。
通过我在网上搜索和总结,目前看来,我发现两种比较方便的方式。
-
CGImage -> CGDataProvider -> CFData -> xx *
CGDataProviderRef provider = CGImageGetDataProvider(CGImage); void *data =(void*) CFDataGetBytePtr(CGDataProviderCopyData(provider));
这样得到的就是void*类型的数据.
-
CGImage -> CGContext -> void *
int sWidth=CGImageGetWidth(CGImage); int sHeight=CGImageGetHeight(CGImage); CGImageRef mContent = CGImage; CGContextRef context = CGBitmapContextCreate(NULL, CGImageGetWidth(mContent), CGImageGetHeight(mContent), CGImageGetBitsPerComponent(mContent), CGImageGetBytesPerRow(mContent), CGImageGetColorSpace(mContent), CGImageGetBitmapInfo(mContent)); CGContextDrawImage(context, CGRectMake(0, 0, sWidth, sHeight), mContent); void *data=CGBitmapContextGetData(context);
另外我在stackOverFlow上看到大家的讨论中,对取得的字节数据每四位做了一个求余运算并都转换成了UIcolor,暂时不是很清楚为什么要这样做。
当得到CGimage的字节数据,有时又需要把它转化成UIImage.
我目前的做法是:
void *data;
CGDataProviderRef pv=CGDataProviderCreateWithData(data, data, sWidth*sHeight*4, ContentReleaseCallBack);
CGImageRef content=CGImageCreate(sWidth , sHeight, 8, 32, 4*sWidth,
CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipLast,
pv, NULL, true, kCGRenderingIntentDefault);
UIImage *ci = [UIImage imageWithCGImage:content];
我测试过以上一套方法,能正常显示图像,只是在alpha的值上和原图有些不一样转成字节数据再转换成UIImage以后,原本是透明的部分变成了黑色,目前我还没有深入去找出原因,但大概的问题可能猜得到.
我也尝试过用
UIImage *ci = [UIImage imageWithData:[NSData dataWithBytes:data length:sWidth*sHeight*4]];
来转化字节数据到UIImage,但这个方法一直没有成功,原因还没搞懂。