为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
心有法竹 2019-11-22 10:18:58
有谁知道为什么CGContextDrawImage要将我的形象颠倒过来?我正在从应用程序中加载图像:UIImage *image = [UIImage imageNamed:@"testImage.png"];然后简单地要求核心图形将其绘制到我的上下文中:CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);它在正确的位置和尺寸进行渲染,但是图像是颠倒的。我一定会在这里遗漏一些真正明显的东西吗?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

代替


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

使用


[image drawInRect:CGRectMake(0, 0, 145, 15)];

在开始/结束CGcontext方法的中间。


这会将具有正确方向的图像绘制到当前图像上下文中-我很确定这与UIImage保持方向知识有关,而该CGContextDrawImage方法在不了解方向的情况下获取了基础原始图像数据。


查看完整回答
反对 回复 2019-11-22
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

即使应用了我提到的所有内容,我仍然会在影像上留下戏剧。最后,我只是使用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);


查看完整回答
反对 回复 2019-11-22
?
狐的传说

TA贡献1804条经验 获得超3个赞

两全其美,请使用UIImage drawAtPoint:或drawInRect:同时指定您的自定义上下文:


UIGraphicsPushContext(context);

[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!

UIGraphicsPopContext();

另外,您还避免使用第二个答案所做的CGContextTranslateCTM或修改您的上下文CGContextScaleCTM。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 992 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信