- 转自:http://www.bennychen.cn/tag/cgcontextdrawimage/
-
使用CGContextDrawImage绘制图片上下颠倒
首先要说的是,在iOS的不同framework中使用着不同的坐标系:
- UIKit - y轴向下
- Core Graphics(Quartz) - y轴向上
- OpenGL ES - y轴向上
UIKit是iPhone SDK的Cocoa Touch层的核心framework,是iPhone应用程序图形界面和事件驱动的基础,它和传统的windows桌面一样,坐标系是y轴向下的; Core Graphics(Quartz)一个基于2D的图形绘制引擎,它的坐标系则是y轴向上的;而OpenGL ES是iPhone SDK的2D和3D绘制引擎,它使用左手坐标系,它的坐标系也是y轴向上的,如果不考虑z轴,在二维下它的坐标系和Quartz是一样的。
现在回到问题,当通过CGContextDrawImage绘制图片到一个context中时,如果传入的是UIImage的CGImageRef,因为UIKit和CG坐标系y轴相反,所以图片绘制将会上下颠倒。解决方法有以下几种,
解决方法一:在绘制到context前通过矩阵垂直翻转坐标系
2 |
CGContextTranslateCTM(context, 0, height); |
3 |
CGContextScaleCTM(context, 1.0, -1.0); |
4 |
CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage); |
解决方法二:使用UIImage的drawInRect函数,该函数内部能自动处理图片的正确方向
2 |
UIGraphicsPushContext( context ); |
3 |
[uiImage drawInRect:CGRectMake(0, 0, width, height)]; |
4 |
UIGraphicsPopContext(); |
解决方法三:垂直翻转投影矩阵
这种方法通过设置上下颠倒的投影矩阵,使得原本y轴向上的GL坐标系看起来变成了y轴向下,并且坐标原点从屏幕左下角移到了屏幕左上角。如果你习惯使用y轴向下的坐标系进行二维操作,可以使用这种方法,同时原本颠倒的图片经过再次颠倒后回到了正确的方向:
4 |
CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage); |
7 |
glMatrixMode(GL_PROJECTION); |
9 |
glOrthof( 0, framebufferWidth, framebufferHeight, 0, -1, 1 ); |
分享到:
相关推荐
5. **绘制图片**: 可以使用`CGContextDrawImage`函数将UIImage对象绘制到上下文中。你需要指定图像的位置和大小。 6. **旋转效果**: 在抽奖转盘中,旋转效果是关键。这可以通过`CGContextTranslateCTM`和`...
4. **绘制水印**:使用CGContextDrawImage方法将原始图片绘制到新创建的位图上下文上。接着,调用Quartz 2D的绘图函数(如CGContextShowTextAtPoint)在合适的位置绘制水印文本或logo。如果水印是图片,可以使用...
另一种方法是使用` UIGraphicsGetImageFromCurrentImageContext()`,在指定的上下文中绘制图片的缩小版本。 4. **图片裁剪**: 裁剪图片需要用到Core Graphics。首先,创建一个与目标裁剪区域相同尺寸的新上下文,...
然后使用 CGContextTranslateCTM 函数来移动图形上下文的原点,然后使用 CGContextRotateCTM 函数来旋转图形上下文,最后使用 CGContextDrawImage 函数来绘制图片。 图片旋转是指将图片旋转一定角度,使得图片的...
- **绘制图片**:接下来,使用`CGContextDrawImage`函数将图片绘制到上下文中。由于上下文已经被设置了剪切区域,所以图片只会在这个区域内显示。 - **获取裁切后的图像**:最后,使用`...
每张图片可以使用`UIImagePNGRepresentation`或`UIImageJPEGRepresentation`转成数据,然后通过`CGContextDrawImage`绘制到PDF上下文。 3. 多张图片合成: 对于多张图片,我们可以遍历图片数组,逐个进行渲染。...
2. **Core Graphics绘图**:我们可以创建一个CGContext,然后在这个上下文中绘制UIImage,使用上述的灰度转换公式将每个像素转换为灰度,最后从这个新的CGContext中获取结果图像。 以下是实现这个功能的步骤: 1. ...
例如,可以使用`CGContextDrawImage`方法将图片绘制到一个更小的上下文中,从而实现图片尺寸的缩小。 2. **Core Image**: Core Image则提供了许多预定义的滤镜和图像处理功能。通过调整滤镜参数,我们可以实现图片...
- 将每个图片加载到CGContext中,通过`CGContextDrawImage`函数绘制图片,设置合适的坐标位置以达到拼接效果。 - 使用`UIGraphicsGetImageFromCurrentImageContext`获取绘制后的图像,最后转换为UIImage对象。 ...
在新创建的图形上下文中,我们将原图片进行翻转并绘制。 3. **裁剪倒影**: 通常,我们不希望整个倒影与原始图片完全相同大小,而是希望它逐渐透明,以模拟真实的倒影效果。这可以通过定义一个渐变区域并裁剪CGImage...
在iOS开发中,图片旋转是一项常见的操作,尤其在处理用户拍摄的照片或者显示图像时,可能需要根据需求调整图片的方向。本教程将详细讲解如何利用系统框架实现图片旋转的效果,通过提供的"图片旋转demo",我们可以...
具体实现时,可以创建一个自定义的UIView子类,覆写`drawRect:`方法,利用`CGContextDrawImage`函数分块绘制图片,同时使用`CGAffineTransform`来设置每个部分的透视变换。此外,可能还需要结合CALayer的`transform`...
在这个项目中,我们可能需要使用CGContextDrawImage方法来绘制CGImage对象到新的CGContext上下文中,从而实现图片的拼接。 2. **CGContext**:这是Core Graphics的核心,代表了绘图表面。开发者可以使用...
图像绘制可以使用`CGContextDrawImage()`方法,而文字绘制则涉及`CGContextSelectFont()`、`CGContextSetTextPosition()`和`CGContextShowTextAtPoint()`等函数。 总的来说,Quartz 2D为iOS开发者提供了丰富的2D...
4. **图像绘制**:加载图片,获取`CGImage`,使用`CGContextDrawImage`将图像绘制到上下文中。 `drawRect:`的正确使用需要注意以下几点: - **性能优化**:避免在`drawRect:`中执行昂贵的操作,因为这个方法可能被...
首先创建一个基于原始图片的位图上下文,接着在该上下文中使用`CGContextDrawImage`绘制原图,再利用`CGContextSelectFont`、`CGContextSetFillColorWithColor`、`CGContextSetTextPosition`等方法设置字体、颜色和...
3. 将原图绘制到上下文中:`CGContextDrawImage(context, CGRectMake(0, 0, originalImage.size.width, originalImage.size.height), originalImage.CGImage);` 4. 反转图片:通过调整CGContext的坐标系统,将图像...
c) 对每帧图片,将其转换为`CGImage`,并使用`CGContextDrawImage`绘制到上下文中。 d) 记录每帧的显示时间和透明度信息。 e) 将`CGContext`的数据编码为GIF格式的`NSData`对象。 f) 使用`UIImage+GIF`或`...
接着,获取该视图的`CGContext`,并用`CGContextDrawImage`绘制图片到上下文中,再用`CGContextGetFillColorAtPoint`来获取指定位置的颜色。 其次,不同颜色响应事件是事件处理机制的应用。开发者可以定义一个颜色...
- 绘制图片:在`CGContext`中使用`CGContextDrawImage`函数绘制图片水印。 5. **混合模式与透明度**:在添加水印时,可以通过设置混合模式(`CGContextSetBlendMode`)来调整水印与底层图像的融合效果,例如使用`...