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為我的所有圖像創建了“垂直翻轉”版本?,F在,我不需要使用任何變換。希望這不會造成進一步的問題。
有誰知道為什么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 關注
- 1072 瀏覽
添加回答
舉報