天天看点

IOS中使用像素位图(CGImageRef)对图片进行处理

cgimageref是定义在quartzcore框架中的一个结构体指针,用c语言编写。在cgimage.h文件中,我们可以看到下面的定义:

<a href="http://my.oschina.net/u/2340880/blog/406437#">?</a>

1

<code>typedef</code> <code>struct</code> <code>cgimage *cgimageref;</code>

cgimageref 和 struct cgimage * 是完全等价的。这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片。

quartzcore这个框架是可移植的。

cftypeid cgimagegettypeid(void)

这个方法返回的是一个编号,每个core foundation框架中得结构都会有一个这样的编号,cftypeid定义如下:

2

3

4

5

6

7

8

9

10

11

<code>#if __llp64__</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>long</code> <code>cftypeid;</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>long</code> <code>cfoptionflags;</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>long</code> <code>cfhashcode;</code>

<code>typedef</code> <code>signed</code> <code>long</code> <code>long</code> <code>cfindex;</code>

<code>#else</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>cftypeid;</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>cfoptionflags;</code>

<code>typedef</code> <code>unsigned </code><code>long</code> <code>cfhashcode;</code>

<code>typedef</code> <code>signed</code> <code>long</code> <code>cfindex;</code>

<code>#endif</code>

这个方法没有特殊的意义,只是一个标识符。

cgimageref cgimagecreate(size_t width, size_t height,

    size_t bitspercomponent, size_t bitsperpixel, size_t bytesperrow,

    cgcolorspaceref space, cgbitmapinfo bitmapinfo, cgdataproviderref provider,

    const cgfloat decode[], bool shouldinterpolate,

    cgcolorrenderingintent intent);

通过这个方法,我们可以创建出一个cgimageref类型的对象,下面分别对参数进行解释:

sizt_t是定义的一个可移植性的单位,在64位机器中为8字节,32位位4字节。

width:图片宽度像素

height:图片高度像素

bitspercomponent:每个颜色的比特数,例如在rgba-32模式下为8

bitsperpixel:每个像素的总比特数

bytesperrow:每一行占用的字节数,注意这里的单位是字节

space:颜色空间模式,例如const cfstringref kcgcolorspacegenericrgb 这个函数可以返回一个颜色空间对象。

bitmapinfo:位图像素布局,枚举如下:

<code>typedef</code> <code>cf_options(uint32_t, cgbitmapinfo) {</code>

<code>  </code><code>kcgbitmapalphainfomask = 0x1f,</code>

<code>  </code><code>kcgbitmapfloatcomponents = (1 &lt;&lt; 8),</code>

<code>    </code> 

<code>  </code><code>kcgbitmapbyteordermask = 0x7000,</code>

<code>  </code><code>kcgbitmapbyteorderdefault = (0 &lt;&lt; 12),</code>

<code>  </code><code>kcgbitmapbyteorder16little = (1 &lt;&lt; 12),</code>

<code>  </code><code>kcgbitmapbyteorder32little = (2 &lt;&lt; 12),</code>

<code>  </code><code>kcgbitmapbyteorder16big = (3 &lt;&lt; 12),</code>

<code>  </code><code>kcgbitmapbyteorder32big = (4 &lt;&lt; 12)</code>

<code>}</code>

provider:数据源提供者

decode[]:解码渲染数组

shouldinterpolate:是否抗锯齿

intent:图片相关参数

cgimageref cgimagemaskcreate(size_t width, size_t height,

    cgdataproviderref provider, const cgfloat decode[], bool shouldinterpolate)

这个方法用于创建mask图片图层,可以设置其显示部分与不显示部分达到特殊的效果,参数意义同上。

cgimageref cgimagecreatecopy(cgimageref image)

这个方法可以复制一个cgimageref对象

cgimageref cgimagecreatewithjpegdataprovider(cgdataproviderref

    source, const cgfloat decode[], bool shouldinterpolate,

    cgcolorrenderingintent intent)

通过jpeg数据源获取图像

cgimageref cgimagecreatewithpngdataprovider(cgdataproviderref source,

通过png数据源获取图像

cgimageref cgimagecreatewithimageinrect(cgimageref image,

    cgrect rect)

截取图像的一个区域重绘图像

cgimageref cgimagecreatewithmask(cgimageref image, cgimageref mask)

截取mask图像的某一区域重绘

cgimageref cgimagecreatewithmaskingcolors(cgimageref image,

    const cgfloat components[])

通过颜色分量数组创建位图

cgimageref cgimagecreatecopywithcolorspace(cgimageref image,

    cgcolorspaceref space)

通过颜色空间模式复制位图

cgimageref cgimageretain(cgimageref image)

引用+1

void cgimagerelease(cgimageref image)

引用-1

bool cgimageismask(cgimageref image)

返回是否为mask图层

size_t cgimagegetwidth(cgimageref image)

获取宽度像素

size_t cgimagegetheight(cgimageref image)

获取高度像素

下面这些方法分别获取相应属性

size_t cgimagegetbitspercomponent(cgimageref image)

size_t cgimagegetbitsperpixel(cgimageref image)

size_t cgimagegetbytesperrow(cgimageref image)

cgcolorspaceref cgimagegetcolorspace(cgimageref image)cg_extern cgimagealphainfo cgimagegetalphainfo(cgimageref image)

cgdataproviderref cgimagegetdataprovider(cgimageref image)

const cgfloat *cgimagegetdecode(cgimageref image)

bool cgimagegetshouldinterpolate(cgimageref image)

cgcolorrenderingintent cgimagegetrenderingintent(cgimageref image)

cgbitmapinfo cgimagegetbitmapinfo(cgimageref image)

使用cgimageref进行图片截取

<code>    </code><code>//原图片</code>

<code>    </code><code>uiimage * img = [uiimage imagenamed:@</code><code>"11.11.52.png"</code><code>];</code>

<code>    </code><code>//转化为位图</code>

<code>    </code><code>cgimageref temimg = img.cgimage;</code>

<code>    </code><code>//根据范围截图</code>

<code>    </code><code>temimg=cgimagecreatewithimageinrect(temimg, cgrectmake(0, 0, 100, 100));</code>

<code>    </code><code>//得到新的图片</code>

<code>    </code><code>uiimage *</code><code>new</code> <code>= [uiimage imagewithcgimage:temimg];</code>

<code>    </code><code>//释放位图对象</code>

<code>    </code><code>cgimagerelease(temimg);</code>

注意:最后必须要调用这个函数,否则会造成内存泄露

<code> </code><code>cgimagerelease(temimg)</code>