博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CGContextRef:mask和layer绘图
阅读量:5094 次
发布时间:2019-06-13

本文共 5372 字,大约阅读时间需要 17 分钟。

编辑图片的几个方法:

        第一种
        先用UIImage对象加载一张图片
        然后转化成CGImageRef放到CGContext中去编辑

        第二种

        用CGImageCreate函数创建CGImageRef
        然后把CGImageRef放到CGContext中去编辑

        第三种

        用CGImageCreateCopy 或者 CGImageCreateCopyWithColorSpace函数拷贝

        CGImageRef CGImageCreate ( size_t width, //图片的宽度 size_t height, //图片的高度 size_t bitsPerComponent, //图片每个颜色的bits,比如rgb颜色空间,有可能是5 或者 8 == size_t bitsPerPixel, //每一个像素占用的buts,15 位24位 32位等等 size_t bytesPerRow, //每一行占用多少bytes 注意是bytes不是bits 1byte = 8bit CGColorSpaceRef colorspace, //颜色空间,比如rgb CGBitmapInfo bitmapInfo, //layout ,像素中bit的布局, 是rgba还是 argb,== CGDataProviderRef provider, //数据源提供者,url或者内存== const CGFloat decode[], //一个解码数组 bool shouldInterpolate, //抗锯齿参数 CGColorRenderingIntent intent //图片渲染相关参数);

创建 image mask的一个途径

CGImageMaskCreate

给图片加mask有两种方法,

第一种
        使用函数 CGImageCreateWithMask 或者 CGImageCreateWithMaskingColors 在图片上直接打上mask
        这样做对原来的图片要求带有 alpha通道,假如没有,那么不会有半透明的效果

第二种

使用 CGContextClipToMask 在图形上下问的某个矩形区域打上mask,这样做无论原先的图片有没有alpha通道,都可以实现半透明效果

位图永远是矩形形状的

iphone支持图片格式:

JPEG, GIF, PNG, TIF, ICO, GMP, XBM, and CUR.

创建一张图片,我们需要提供的一些东西

A bitmap data source
An optional Decode Array, 这个数组在渲染的时候会应用在每一个像素上面,是一个颜色变成另外一个颜色。
An interpolation setting, 布尔值,缩放图片的时候是否采用interpolation算法,具体这个算法不怎么了解
渲染意向
图片尺寸
Pixel Format:这个包括3个东西,
1,Bits per component,每一个component有多少Bits
2. Bits per pixel, 每一个像素占多少Bits
3. Bytes per row,每一个占多少Bytes
Color Spaces and Bitmap Layout,这里需要提供的几个东西
1,Whether a bitmap contains an alpha channel. 位图是否包含alpha通道
2。 color components是否已经乘以alpha value
3。数据格式是浮点数还是整型
Bitmap Layout是指color components的指是怎么指定的
下面的参数 bitmapInfo就是 Bitmap Layout

CGImageRef CGImageCreate ( size_t width, size_t height, size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo, CGDataProviderRef provider, const CGFloat decode[], bool shouldInterpolate, CGColorRenderingIntent intent);

选择一个函数来创建图像

CGImageRef CGImageCreate ( size_t width, size_t height, size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo, CGDataProviderRef provider, const CGFloat decode[], bool shouldInterpolate, CGColorRenderingIntent intent);

这个是比较万能的函数,但是提供的参数也是非常的多

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 CGImageSourceCreateImageAtIndex ( CGImageSourceRef isrc, size_t index, CFDictionaryRef options);

从一个图片源中创建图片,这个图片源可能包含不止一张图片,0表示第一张

CGImageRef CGImageSourceCreateThumbnailAtIndex ( CGImageSourceRef isrc, size_t index, CFDictionaryRef options);

创建一个缩略图从一个图片源中,这个图片源可能包含不止一张图片,0表示第一张

CGImageRef CGBitmapContextCreateImage ( CGContextRef c);

从一个图形上下文中创建图片

CGImageRef CGImageCreateCopy ( CGImageRef image);

拷贝一张图片

CGImageRef CGImageCreateCopyWithColorSpace ( CGImageRef image, CGColorSpaceRef colorspace);

拷贝一张图片,替换原来的颜色空间

从jpeg创建图片

void MyCreateAndDrawBitmapImage (CGContextRef myContext, CGRect myContextRect, const char *filename);{ CGImageRef image; CGDataProviderRef provider; CFStringRef path; CFURLRef url; path = CFStringCreateWithCString (NULL, filename, kCFStringEncodingUTF8); url = CFURLCreateWithFileSystemPath (NULL, path, // 2 kCFURLPOSIXPathStyle, NO); CFRelease(path); provider = CGDataProviderCreateWithURL (url);// 3 CFRelease (url); image = CGImageCreateWithJPEGDataProvider (provider,// 4 NULL, true, kCGRenderingIntentDefault); CGDataProviderRelease (provider);// 5 CGContextDrawImage (myContext, myContextRect, image);// 6 CGImageRelease (image);// 7}CGImageRef CGImageMaskCreate ( size_t width, size_t height, size_t bitsPerComponent, size_t bitsPerPixel, size_t bytesPerRow, CGDataProviderRef provider, const float decode[], int shouldInterpolate);

从一个已经存在的图形上下文中创建一个CGLayerRef

CGLayerRef CGLayerCreateWithContext ( CGContextRef context, CGSize size, CFDictionaryRef auxiliaryInfo);CGSize CGLayerGetSize ( CGLayerRef layer);

然后从CGLayerRef中得到CGContextRef,就是图形上下文

CGContextRef CGLayerGetContext ( CGLayerRef layer);

接着在这个CGContextRef中绘画

Draw the CGLayer to the Destination Graphics Contextvoid CGContextDrawLayerInRect ( CGContextRef context, CGRect rect, CGLayerRef layer);void CGContextDrawLayerAtPoint ( CGContextRef context, CGPoint point, CGLayerRef layer);

Transparency Layers 阴影

Transparency Layers 给我们很方便的画阴影

void CGContextBeginTransparencyLayer ( CGContextRef context, CFDictionaryRef auxiliaryInfo );

函数第二个参数可以传递一些设置参数,没有就传NULL

看下面的示例代码

CGSize myShadowOffset = CGSizeMake (10, -20);// 设置阴影的偏移量CGContextSetShadow (myContext, myShadowOffset, 5); // 第三个参数表示透明和模糊度CGContextBeginTransparencyLayer (myContext, NULL);CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);CGContextFillRect (myContext, CGRectMake (wd/3+ 50,ht/2 ,wd/4,ht/4));CGContextEndTransparencyLayer (myContext);CGContextBeginTransparencyLayer (myContext, NULL);// 4CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);CGContextFillRect (myContext, CGRectMake (wd/3-50,ht/2-100,wd/4,ht/4));CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);CGContextFillRect (myContext, CGRectMake (wd/3,ht/2-50,wd/4,ht/4));CGContextEndTransparencyLayer (myContext);

转载于:https://www.cnblogs.com/shuangmuyu-S15/p/3497620.html

你可能感兴趣的文章
UOJ#33. 【UR #2】树上GCD 点分治 莫比乌斯反演
查看>>
wpf 依赖性属性
查看>>
Python基础-数据类型
查看>>
Gym - 100989G (二分法)
查看>>
第三周学习进度条
查看>>
spark 参数调优
查看>>
精彩博文收集目录索引(程序猿就是我)
查看>>
搭建日志环境并配置显示DDL语句
查看>>
SelectorChapek(选择器的快速创建)
查看>>
使用Java合并图片、修改DPI
查看>>
JPush极光推送 Java调用服务器端API开发
查看>>
Virtualbox 无法加载usb解决办法
查看>>
Linux常用命令
查看>>
ubuntu 下LAMP服务器环境搭建
查看>>
centos7 安装SVN
查看>>
【ZH奶酪】如何用sklearn计算中文文本TF-IDF?
查看>>
USACO Shaping Regions,难题,离散化,矩形切割,逆序染色
查看>>
iis 还原配置
查看>>
设计模式——门面模式
查看>>
自己动手打造工具系列之自动刷新简历
查看>>