iOS 取得CGimage字节数据的方法

一直没在sdk的api中发现有比较简便直观的取得CGimage字节数据的方法,自己曾经在这上面来来去去花了不少时间,有时实现了,但没有做相关总结,下次使用时又忘记,又重新捣鼓一遍,浪费经历和时间。

通过我在网上搜索和总结,目前看来,我发现两种比较方便的方式。

1. CGImage -> CGDataProvider -> CFData -> xx *

  
  
  1. CGDataProviderRef provider = CGImageGetDataProvider(CGImage);
  2. void *data =(void*) CFDataGetBytePtr(CGDataProviderCopyData(provider));

这样得到的就是void*类型的数据.

2. CGImage -> CGContext -> void *

  
  
  1. int sWidth=CGImageGetWidth(CGImage);
  2. int sHeight=CGImageGetHeight(CGImage);
  3. CGImageRef mContent = CGImage;
  4. CGContextRef context = CGBitmapContextCreate(NULL, CGImageGetWidth(mContent), CGImageGetHeight(mContent),
  5. CGImageGetBitsPerComponent(mContent), CGImageGetBytesPerRow(mContent),
  6. CGImageGetColorSpace(mContent), CGImageGetBitmapInfo(mContent));
  7. CGContextDrawImage(context, CGRectMake(0, 0, sWidth, sHeight), mContent);
  8. void *data=CGBitmapContextGetData(context);

另外我在stackOverFlow上看到大家的讨论中,对取得的字节数据每四位做了一个求余运算并都转换成了UIcolor,暂时不是很清楚为什么要这样做。

当得到CGimage的字节数据,有时又需要把它转化成UIImage.

我目前的做法是:

  
  
  1. void *data;
  2. CGDataProviderRef pv=CGDataProviderCreateWithData(data, data, sWidth*sHeight*4, ContentReleaseCallBack);
  3. CGImageRef content=CGImageCreate(sWidth , sHeight, 8, 32, 4*sWidth,
  4. CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrder32Big | kCGImageAlphaNoneSkipLast,
  5. pv, NULL, true, kCGRenderingIntentDefault);
  6. UIImage *ci = [UIImage imageWithCGImage:content];

我测试过以上一套方法,能正常显示图像,只是在alpha的值上和原图有些不一样转成字节数据再转换成UIImage以后,原本是透明的部分变成了黑色,目前我还没有深入去找出原因,但大概的问题可能猜得到.

我也尝试过用

  
  
  1. UIImage *ci = [UIImage imageWithData:[NSData dataWithBytes:data length:sWidth*sHeight*4]];

来转化字节数据到UIImage,但这个方法一直没有成功,原因还没搞懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值