3 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
代替
CGContextDrawImage(context, CGRectMake(0, 0, 145, 15), image.CGImage);
使用
[image drawInRect:CGRectMake(0, 0, 145, 15)];
在開始/結(jié)束CGcontext方法的中間。
這會(huì)將具有正確方向的圖像繪制到當(dāng)前圖像上下文中-我很確定這與UIImage保持方向知識(shí)有關(guān),而該CGContextDrawImage方法在不了解方向的情況下獲取了基礎(chǔ)原始圖像數(shù)據(jù)。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
即使應(yīng)用了我提到的所有內(nèi)容,我仍然會(huì)在影像上留下戲劇。最后,我只是使用Gimp為我的所有圖像創(chuàng)建了“垂直翻轉(zhuǎn)”版本。現(xiàn)在,我不需要使用任何變換。希望這不會(huì)造成進(jìn)一步的問題。
有誰知道為什么CGContextDrawImage會(huì)顛倒繪制我的圖像?我正在從應(yīng)用程序中加載圖像:
Quartz2d使用不同的坐標(biāo)系,其原點(diǎn)位于左下角。因此,當(dāng)Quartz繪制100 * 100圖像的像素x [5],y [10]時(shí),該像素是在左下角而不是左上角繪制的。從而導(dǎo)致“翻轉(zhuǎn)”圖像。
x坐標(biāo)系匹配,因此您需要翻轉(zhuǎn)y坐標(biāo)。
CGContextTranslateCTM(context, 0, image.size.height);
這意味著我們已經(jīng)在x軸上平移了圖像0個(gè)單位,在y軸上平移了圖像的高度。但是,僅此一項(xiàng)就意味著我們的圖像仍然是上下顛倒的,只是在我們希望繪制的位置下方繪制了“ image.size.height”。
Quartz2D編程指南建議使用ScaleCTM并傳遞負(fù)值來翻轉(zhuǎn)圖像。您可以使用以下代碼執(zhí)行此操作-
CGContextScaleCTM(context, 1.0, -1.0);
在CGContextDrawImage通話之前將兩者結(jié)合起來,應(yīng)該可以正確繪制圖像。
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);
請(qǐng)小心,如果您的imageRect坐標(biāo)與圖像的坐標(biāo)不匹配,因?yàn)檫@樣可能會(huì)導(dǎo)致意外的結(jié)果。
轉(zhuǎn)換回坐標(biāo):
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0, -imageRect.size.height);

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊
兩全其美,請(qǐng)使用UIImage drawAtPoint:或drawInRect:同時(shí)指定您的自定義上下文:
UIGraphicsPushContext(context);
[image drawAtPoint:CGPointZero]; // UIImage will handle all especial cases!
UIGraphicsPopContext();
另外,您還避免使用第二個(gè)答案所做的CGContextTranslateCTM或修改您的上下文CGContextScaleCTM。
- 3 回答
- 0 關(guān)注
- 1092 瀏覽
添加回答
舉報(bào)