CGContextRef CIImageRef详解

第一种 
先用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

GImageRef 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 Context

void 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);// 4

CGContextSetRGBFillColor (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/Free-Thinker/p/5112738.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[react] react怎么拿到组件对应的DOM元素?

[react] react怎么拿到组件对应的DOM元素&#xff1f; 在Class组件中 import React from react; class CComponent extends React.Component {refDiv React.createRef();componentDidMount () {console.log(this.refDiv.current)}render () {return <div><div class…

linux缩小lv发生文件系统错误

众所周知&#xff0c;linux lvm 扩大lv是先扩大lv&#xff0c;然后再扩大文件系统&#xff0c;所以有的人就认为缩小lv也是先缩小lv,再缩小文件系统&#xff0c;当然博主刚开始也那么认为&#xff0c;导致lvresize 以后&#xff0c;lv的大小小于文件系统大小而无法挂载&#xf…

Fedora12上编译安装gdb-7.2

在Fedora12上编译安装gdb-7.2&#xff1a;编译安装gdb和gdbserver 1. 下载gdb7.2: ftp://sourceware.org/pub/gdb/releases/gdb-7.2a.tar.bz2 2. 编译安装gdb 2.1 解压&#xff1a; [zcm~ #1]$cd /mnt/hgfs/opensource/ [zcmopensource #2]$ls a52dec ffmpeg-1.2…

[react-router] react的路由和普通路由有什么区别?

[react-router] react的路由和普通路由有什么区别&#xff1f; React路由是前端的路由&#xff0c;普通路由指的是后端的路由React路由不管是hash还是browser的模式&#xff0c;都是在响应了hash/browser的change之后&#xff0c;再变更页面的DOM结构&#xff0c;由于是单页应…

UITableView 性能优化

网络图片异步加载&#xff0c;SDWebImage。文字直接 drawInRect/drawAtPoint 绘制&#xff0c;参考 ABTableViewCell&#xff0c;AdvancedTableViewCells。本地图片也可以直接绘制&#xff0c;或者用 CALayer 来添加显示。cell 重用机制。cell 内容尽量避免透明效果。如非必要&…

Hello Views之Spinner(yaozq翻译,仅供参考)

Spinner是一种类似于下拉列表的widget。 在这个教程中&#xff0c;你将创建一个简单的用于展示星球列表的spinner组件。当选择列表中的一项时&#xff0c;将会弹出一个表示所选项的toast信息。下面是具体步骤&#xff1a; 1&#xff0c;新建一个名为HelloSpinner的项目。 2&…

error PRJ0003 : 生成“cl.exe”时出错 解决方案

本人已经安装了VS2010&#xff0c;但是同事给的项目是用VC2008写的&#xff0c;用到几个lib文件&#xff0c;路径也都正确&#xff0c;但就是无法正确解析&#xff0c;所以我怀疑是lib库生成的环境问题。所以考虑装个VC2008。但是我又不敢直接安装VS2008&#xff0c;怕破坏VS20…

[react] 简要描述下你知道的react工作原理是什么?

[react] 简要描述下你知道的react工作原理是什么&#xff1f; 我理解的核心部分&#xff1a; 通过虚拟DOM表达真实DOM通过数据驱动更新虚拟DOM进而更新真实DOM&#xff08;MVVM&#xff09;有一套完整并且合理的 DOM Diff 算法&#xff08;现在 React 17 是基于 lane 架构来调…

Bitmap 之 getPixels() 的 stride

学习Graphics中遇到位图(Bitmap)中getPixels()方法&#xff0c;对该方法的用法大体理解&#xff0c;但对其中的stride参数却不明白具体的用法以及用意&#xff0c;现记述过程如下&#xff1a; getPixels()方法的用处为获取位图(Bitmap)中的像素值(颜色值)&#xff0c;存入类型为…

i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例

From: http://blog.csdn.net/leo115/article/details/8101541 我们通常在写for循环 的时候&#xff0c;要实现变量 i 的自增 1 &#xff1b;往往会在i 和i中随便挑一种写&#xff0c;对于i和i的理解&#xff0c;我们往往停留在返回的值的不同&#xff0c;其实i与i在实现效率上…

day②:字典的fromkeys方法

start##fromkeys方法本身就是把所有的key都指向同一个对象了>>> cdict.fromkeys(range(5),[]) >>> c{0: [], 1: [], 2: [], 3: [], 4: []}>>> c[0].append({"B":{123}})>>> c{0: [{B: set([123])}], 1: [{B: se…

[react-router] React-Router的实现原理是什么?

[react-router] React-Router的实现原理是什么&#xff1f; 1.react-router依赖基础 - history&#xff0c;是一个独立的第三方js库&#xff0c;可以用来兼容在不同浏览器、不同环境下对历史记录的管理&#xff0c;拥有统一的API。具体来说里面的history分为三类: HashRouter…

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 —— Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定&#xff08;与 C 语言的异同&#xff09; BASH 中的基本流程控制语法 函数的使用 2.1 最简单的例子 —— Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是…

[react] 请描述下事件在react中的处理方式是什么?

[react] 请描述下事件在react中的处理方式是什么&#xff1f; 所有时间都挂载到 document 上&#xff0c;然后捕获对应的 dom。 类似事件委托 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. 时间复杂度O(N*log^3(N))------------------------------------------------------…

标准RTSP 消息的错误代码

From: http://blog.csdn.net/ameyume/article/details/7441060 标准RTSP消息的错误代码–在应答消息的第一行表示 ”100” ; Continue (all 100 range) “110”; Connect Timeout “200” ; OK ”201” ; Created ”250” ; Low on Storage Space ”300” ; Multiple Choic…

[react-router] React-Router怎么设置重定向?

[react-router] React-Router怎么设置重定向&#xff1f; 采用 Redirect 进行重定向 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

struts2遍历select

2019独角兽企业重金招聘Python工程师标准>>> <s:bean name"org.apache.struts2.util.Counter" id"counter"> <s:param name"first" value"1" /> <s:param name"last" value"pageCount"…

[建议]我对软工有话说(上)

我对软工有话说 经历了一学期的软件工程课程实践&#xff0c;先给个自己在这门课中学到的东西打个分&#xff1a; 编码能力&#xff1a;★★★代码质量&#xff1a;★★★★团队管理&#xff1a;★★★★★风险控制&#xff1a;★★★★解决问题的能力&#xff1a;★★★★★下…

[react-router] React-Router的路由有几种模式?

[react-router] React-Router的路由有几种模式&#xff1f; 1、BrowserRouter&#xff1a;浏览器的路由方式&#xff0c;也就是在开发中最常使用的路由方式 2、HashRouter&#xff1a;在路径前加入#号成为一个哈希值&#xff0c;Hash模式的好处是&#xff0c;再也不会因为我们…