CGContextDrawImage在传递UIImage.CGImage时将图像上下颠倒

有谁知道为什么CGContextDrawImage要将我的形象颠倒过来?我正在从应用程序中加载图像:


UIImage *image = [UIImage imageNamed:@"testImage.png"];

然后简单地要求核心图形将其绘制到我的上下文中:


CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);

它在正确的位置和尺寸进行渲染,但是图像是颠倒的。我一定会在这里遗漏一些真正明显的东西吗?


心有法竹
浏览 994回答 3
3回答

人到中年有点甜

代替CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);使用[image drawInRect:CGRectMake(0, 0, 145, 15)];在开始/结束CGcontext方法的中间。这会将具有正确方向的图像绘制到当前图像上下文中-我很确定这与UIImage保持方向知识有关,而该CGContextDrawImage方法在不了解方向的情况下获取了基础原始图像数据。

蓝山帝景

即使应用了我提到的所有内容,我仍然会在影像上留下戏剧。最后,我只是使用Gimp为我的所有图像创建了“垂直翻转”版本。现在,我不需要使用任何变换。希望这不会造成进一步的问题。有谁知道为什么CGContextDrawImage会颠倒绘制我的图像?我正在从应用程序中加载图像:Quartz2d使用不同的坐标系,其原点位于左下角。因此,当Quartz绘制100 * 100图像的像素x [5],y [10]时,该像素是在左下角而不是左上角绘制的。从而导致“翻转”图像。x坐标系匹配,因此您需要翻转y坐标。CGContextTranslateCTM(context, 0, image.size.height);这意味着我们已经在x轴上平移了图像0个单位,在y轴上平移了图像的高度。但是,仅此一项就意味着我们的图像仍然是上下颠倒的,只是在我们希望绘制的位置下方绘制了“ image.size.height”。Quartz2D编程指南建议使用ScaleCTM并传递负值来翻转图像。您可以使用以下代码执行此操作-CGContextScaleCTM(context, 1.0, -1.0);在CGContextDrawImage通话之前将两者结合起来,应该可以正确绘制图像。UIImage *image = [UIImage imageNamed:@"testImage.png"];    CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);       CGContextTranslateCTM(context, 0, image.size.height);CGContextScaleCTM(context, 1.0, -1.0);CGContextDrawImage(context, imageRect, image.CGImage);请小心,如果您的imageRect坐标与图像的坐标不匹配,因为这样可能会导致意外的结果。转换回坐标:CGContextScaleCTM(context, 1.0, -1.0);CGContextTranslateCTM(context, 0, -imageRect.size.height);

狐的传说

两全其美,请使用UIImage drawAtPoint:或drawInRect:同时指定您的自定义上下文:UIGraphicsPushContext(context);[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!UIGraphicsPopContext();另外,您还避免使用第二个答案所做的CGContextTranslateCTM或修改您的上下文CGContextScaleCTM。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS