# CGImageRef基本介绍及方法说明

在IOS开发中,我们时常会用到裁剪图片,重绘图片等方法,CGImageRef(像素位图)便是我们经常会使用到的一个对象.

## CGImageRef是什么

CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写.在CGImage.h文件中,我们可以看到下面的定义:

```
typedef struct CGImage * CGImageRef;
```

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

QuartzCore这个框架是可移植的.

## CGImageRef相关的一些方法说明

* 返回标识符

```
CFTypeID CGImageGetTypeID(void)

//CFTypeID定义如下：

#if __LLP64__
typedef unsigned long long CFTypeID;
typedef unsigned long long CFOptionFlags;
typedef unsigned long long CFHashCode;
typedef signed long long CFIndex;
#else
typedef unsigned long CFTypeID;
typedef unsigned long CFOptionFlags;
typedef unsigned long CFHashCode;
typedef signed long CFIndex;
#endif
```

//这个方法返回的是一个编号,每个Core Foundation框架中得结构都会有一个这样的编号,它没有特殊的意义,只是一个标识符.

* 创建出一个CGImageRef类型的对象的方法

```
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);
```

参数解释:

| 参数                | 说明                                                                  |
| ----------------- | ------------------------------------------------------------------- |
| sizt\_t           | 定义的一个可移植性的单位,在64位机器中为8字节,32位位4字节.                                   |
| width             | 图片宽度像素                                                              |
| height            | 图片高度像素                                                              |
| bitsPerComponent  | 每个颜色的比特数,例如在rgba-32模式下为8                                            |
| bitsPerPixel      | 每个像素的总比特数                                                           |
| bytesPerRow       | 每一行占用的字节数,注意这里的单位是字节                                                |
| space             | 颜色空间模式,例如const CFStringRef kCGColorSpaceGenericRGB 这个函数可以返回一个颜色空间对象 |
| bitmapInfo        | 位图像素布局                                                              |
| provider          | 数据源提供者                                                              |
| decode\[]         | 解码渲染数组                                                              |
| shouldInterpolate | 是否抗锯齿                                                               |
| intent            | 图片相关参数                                                              |

bitmapInfo的枚举:

```
typedef CF_OPTIONS(uint32_t, CGBitmapInfo) {
  kCGBitmapAlphaInfoMask = 0x1F,
  kCGBitmapFloatComponents = (1 << 8),

  kCGBitmapByteOrderMask = 0x7000,
  kCGBitmapByteOrderDefault = (0 << 12),
  kCGBitmapByteOrder16Little = (1 << 12),
  kCGBitmapByteOrder32Little = (2 << 12),
  kCGBitmapByteOrder16Big = (3 << 12),
  kCGBitmapByteOrder32Big = (4 << 12)
}
```

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

```
CGImageRef CGImageMaskCreate(size_t width, size_t height,

    size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow,

    CGDataProviderRef provider, const CGFloat decode[], bool shouldInterpolate)
```

* 复制一个CGImageRef对象

```
CGImageRef CGImageCreateCopy(CGImageRef image)
```

* 通过JPEG数据源获取图像

```
CGImageRef CGImageCreateWithJPEGDataProvider(CGDataProviderRef

    source, const CGFloat decode[], bool shouldInterpolate,

    CGColorRenderingIntent intent)
```

* 通过PNG数据源获取图像

```
CGImageRef CGImageCreateWithPNGDataProvider(CGDataProviderRef source,

    const CGFloat decode[], bool shouldInterpolate,

    CGColorRenderingIntent intent)
```

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

```
CGImageRef CGImageCreateWithImageInRect(CGImageRef image, CGRect rect)
```

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

```
CGImageRef CGImageCreateWithMask(CGImageRef image, CGImageRef mask)
```

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

```
CGImageRef CGImageCreateWithMaskingColors(CGImageRef image,  const CGFloat components[])
```

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

```
CGImageRef CGImageCreateCopyWithColorSpace(CGImageRef image, CGColorSpaceRef space)
```

* 引用+1 -1

```
CGImageRef CGImageRetain(CGImageRef image)
void CGImageRelease(CGImageRef image)
```

最后必须要调用CGImageRelease释放位图对象否则会造成内存泄露

* 返回是否为Mask图层

```
bool CGImageIsMask(CGImageRef image)
```

* 获取相应属性

```
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与UIImage互转

UIImage虽然可以加载、显示各种格式的位图,甚至可以同时加载图片,接下来依次播放多张图片形成动画.但UIImage的功能依然有限,它不能对图片进行缩放、旋转,不能"挖取"源图片的指定区域等,这些功能可借助Quartz 2D的CGImageRef来实现.实际运用中我们就需要UIImage与CGImageRef之间相互转换,方法如下

```
//CGImageRef  转换成UIImage  

CGImageRef cgRef= CGBitmapContextCreateImage(context);  
UIImage* image = [UIImage imageWithCGImage: cgRef];  


//UIImage转换成CGImageRef  

UIImage *uiImage = [UIImage imageNamed:@"abc.png"];  
CGImageRef cgRef1 = uiImage.CGImage;
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://philm.gitbook.io/philm-ios-wiki/mei-zhou-yue-du/cgimageref-ji-ben-jie-shao-ji-fang-fa-shuo-ming.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
