3 回答
TA贡献1895条经验 获得超7个赞
代替
CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);
使用
[image drawInRect:CGRectMake(0, 0, 145, 15)];
在开始/结束CGcontext方法的中间。
这会将具有正确方向的图像绘制到当前图像上下文中-我很确定这与UIImage保持方向知识有关,而该CGContextDrawImage方法在不了解方向的情况下获取了基础原始图像数据。
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);
TA贡献1804条经验 获得超3个赞
两全其美,请使用UIImage drawAtPoint:或drawInRect:同时指定您的自定义上下文:
UIGraphicsPushContext(context);
[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!
UIGraphicsPopContext();
另外,您还避免使用第二个答案所做的CGContextTranslateCTM或修改您的上下文CGContextScaleCTM。
- 3 回答
- 0 关注
- 992 浏览
添加回答
举报