IOS中对图片进行重绘处理的方法总结
一、CGImageRef是什么
CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写。在CGImage.h文件中,我们可以看到下面的定义:
|
1
|
typedef struct CGImage *CGImageRef; |
CGImageRef 和 struct CGImage * 是完全等价的。这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片。
QuartzCore这个框架是可移植的。
二、CGImageRef相关的一些方法解析
CFTypeID CGImageGetTypeID(void)
这个方法返回的是一个编号,每个Core Foundation框架中得结构都会有一个这样的编号,CFTypeID定义如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
#if __LLP64__typedef unsigned long long CFTypeID;typedef unsigned long long CFOptionFlags;typedef unsigned long long CFHashCode;typedef signed long long CFIndex;#elsetypedef unsigned long CFTypeID;typedef unsigned long CFOptionFlags;typedef unsigned long CFHashCode;typedef signed long CFIndex;#endif |
这个方法没有特殊的意义,只是一个标识符。
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:位图像素布局,枚举如下:
|
1
2
3
4
5
6
7
8
9
10
11
|
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)} |
provider:数据源提供者
decode[]:解码渲染数组
shouldInterpolate:是否抗锯齿
intent:图片相关参数
CGImageRef CGImageMaskCreate(size_t width, size_t height,
size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow,
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,
const CGFloat decode[], bool shouldInterpolate,
CGColorRenderingIntent intent)
通过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进行图片截取
|
1
2
3
4
5
6
7
8
9
10
|
//原图片 UIImage * img = [UIImage imageNamed:@"11.11.52.png"]; //转化为位图 CGImageRef temImg = img.CGImage; //根据范围截图 temImg=CGImageCreateWithImageInRect(temImg, CGRectMake(0, 0, 100, 100)); //得到新的图片 UIImage *new = [UIImage imageWithCGImage:temImg]; //释放位图对象 CGImageRelease(temImg); |
注意:最后必须要调用这个函数,否则会造成内存泄露
|
1
|
CGImageRelease(temImg) |
IOS中对图片进行重绘处理的方法总结的更多相关文章
- iOS 视图:重绘与UIScrollView(内容根据iOS编程编写)
我们继续之前的 Hypnosister 应用,当用户开始触摸的时候,圆形的颜色会改变. 首先,在 JXHypnosisView 头文件中声明一个属性,用来表示圆形的颜色. #import " ...
- 【MFC】MFC中窗口重绘
MFC中窗口重绘 摘自:http://blog.csdn.net/shuilan0066/article/details/5859057 在刷新窗口时经常要调用重绘函数 MFC提供了三个函数用于窗口重 ...
- MFC中窗口重绘
搬家于CSDN 2015-05-14 MFC提供了三个函数用于窗口重绘 InvalidateRect(&Rect) Invalidate() UpdateWindow() 当需要更新或者重绘窗 ...
- java中的重绘
void java.awt.Container.validate()Validates this container and all of its subcomponents.这个函数更新容器及其全部 ...
- WinForm中的重绘 - 按钮等控件的背景渐变色重绘
注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. private void PaintGradientBackground(Button ...
- Winfrom 减少控件重绘闪烁的方法
Winform控件的双缓冲.控件的双缓冲属性是隐藏的,可以通过反射改变其属性值. lv.GetType().GetProperty("DoubleBuffered", Bindin ...
- iOS中UI阶段常用的一些方法
UI 即 UserInterface(用户界面 1.iOS系统版本,每年都有更新.对我们开发者而言,主要的是观察API的变化. 2.iPhone新手机发布,会产生不同尺寸的屏幕,现在市面上有4种尺寸, ...
- IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
- iOS中UIKit的外观属性及方法汇总
这里将UIKit的外观属性及方法从头文件中抽取出来,以便查找及熟悉.(更新到iOS 8.0,从A-Z排序) UIActivityIndicatorView @property (readwrite, ...
随机推荐
- c++11 NULL、0、nullptr
C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL;foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #de ...
- LoadRunner测试下载功能点脚本(方法二)
在上一篇<LoadRunner下载功能点脚本(方法一)>中,实现的脚本仅是录制下载功能点的脚本,现在性能需求的场景更改如下: 性能需求:对系统某页面中,点击下载并将下载文件保存到本地电脑的 ...
- js的水仙花数的输出
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- js中的function
Math方法详解 Math.sqrt(x) 计算X开平方 Math.sqrt(x,y) 计算xy Math.round(x) 计算x 四舍五入的值 getBoundingClientRe ...
- 【android】Android检查是否已经连接到网络
ConnectivityManager con=(ConnectivityManager)getSystemService(Activity.CONNECTIVITY_SERVICE); boolea ...
- 关于jquery-easyUI中主键属性data-options的了解
data-options是jQuery Easyui 最近两个版本才加上的一个特殊属性.通过这个属性,我们可以对easyui组件的实例化可以完全写入到html中,例如: <div class=& ...
- CSS3笔记(一)
最开始的时候 CSS3产生的一个新属性是一个浏览器的私有的,然后W3C 可能会拿来采用做个标准,再没公布标准之前就只能用私有属性(加前缀)来表达各自厂商的实现,主要是CSS3刚出现那会儿,它暗示该CS ...
- jquery 获取多个dom对象的方法
$("[name=trade]").each(function(){ for(j=0;j<info.trade.length;j++){ if( $(this).val() ...
- Cut the sticks
def main(): n = int(raw_input()) arr = map(int, raw_input().strip().split()) for i in range(n): cutN ...
- 让WordPress的作者在后台只能看到自己的文章
今天需要对WordPress后台进行调整,目的是为了只能让当前用户看见自己所发表的文章,而WordPress默认是登陆用户可以看到所有用户发表的文章. WordPress中的用户角色分的比较详细,作者 ...