uiimage转换成cximage
1、将uiimage转换cximage需要将uiimage中的数据提取出来,并放置到一个char*中:
我们定义一个名为imageData的unsigned char*类型(注意malloc空间,同时也要注意使用完后free掉),而接下来要做的就是把uiimage中的数据转变成我们定义的imagedata,那么,该如何转变呢?以下两个函数需要注意:CGBitmapContextCreate和CGContextDrawimage.
首先,我们说说第一个函数,第一个函数是用来获取位图图形的上下文信息的,所以我们需要先定义一个CGContextRef的实例,我们命名为cgcnt.然后我们就该说说CGBitmapContextCreate的7个参数了,CGBitmapContextCreate共有7个参数,从第一个到最后一个分别是void *data、size_t width、size_t height、size_t bitsPerComponent、size_t bitsPerRow、CGColorSpaceRef colorspace、CGBitmapInfo bitmapInfo,第一个参数指向的是存储空间的地址,也就是我们前面定义的imageData;第二个参数是位图的宽;第三个参数是位图的高;第四个指的是每个像素的位数;第五个指的是像素一行的字节数;第六个是用来获取颜色信息的,我们需要定义一个CGColorSpaceRef ,CGColorSpaceRef有很多种,我们选择其中的CGColorSpaceCreateDeviceRGB();第七个使用来存储位图信息的,它同样有多种,我们选择kCGImageAlphaPremultipliedLast。设置好这7个参数,我们也就得到了位图的上下文信息了。
然后,根据上面得到的位图上下文信息,利用CGContextDrawimage来实现转换的目的了。CGContextDrawimage有3个参数,第一个参数表示的就是我们上文创建的位图上下文信息,第二个参数表示的是图像的范围大小,第三个参数表示的是一个CGImage,而这个CGImage就是我们需要转换的uiimage通过CGImage方法得到的。
知道了所有的参数信息,除了CGColorSpaceRef和CGBitmapInfo需要查查帮助外,我们就可以看图填空了,就这样,我们完成了一个从uiimage转换到cximage的过程。
友情提示:转换之后记得release掉CGColorSpace和CGContextRef,我们可以分别调用CGColorSpaceRelease和CGContextRelease进行release操作。
2、将unsigned char*转换为cximage:
首先我们需要定义一个cximage,我们命名为xiImage。调用cximage的Create(注意是32位)和AlphaCreate函数创建一个空白的cximage。接下来就是为这个空白的cximage填充颜色了,所以我们还需要定义一个RGBQUAD,然后将imagedata中的数据赋到RGBQUAR上(每赋值一个像素就调用一次cximage的SetPixelColor函数将它写到xiImage上),
具体赋值可见代码
for(int y = 0;y < uiImage.size.height;y++)
{
for(int x =0;x <uiImage.size.width;x++)
{
rgbquad.rgbRed =imageData[4*(int)uiImage.size.width*y+4*x];
rgbquad.rgbGreen =imageData[4*(int)uiImage.size.width*y+4*x+1];
rgbquad.rgbBlue =imageData[4*(int)uiImage.size.width*y+4*x+2];
rgbquad.rgbReserved =imageData[4*(int)uiImage.size.width*y+4*x+3];
xiImage->SetPixelColor(x,y, rgbquad,true);
}
}
得到的xiImage就是将uiimage转换得到的cximage。
注意:结束上述循环赋值操作后,记得free掉imagedata!
cximage转换成uiimage会在下一篇文章会中阐述。
友情提示:导入cximage动态库后,需要将m文件变为mm文件使之能够识别c++的函数,ximage.h头文件需要在mm文件中加入。