แม้หลังจากใช้ทุกอย่างที่ฉันได้พูดไปแล้วฉันก็ยังคงมีละครด้วยภาพ ในท้ายที่สุดฉันเพิ่งใช้ Gimp เพื่อสร้างภาพทั้งหมดของฉันในแนวตั้ง ตอนนี้ฉันไม่จำเป็นต้องใช้การแปลงใด ๆ หวังว่านี่จะไม่ทำให้เกิดปัญหาเพิ่มเติมในการติดตาม
ไม่มีใครรู้ว่าทำไม CGContextDrawImage จะวาดภาพของฉันกลับหัวกลับหาง? ฉันกำลังโหลดภาพจากใบสมัครของฉัน:
Quartz2d ใช้ระบบพิกัดที่แตกต่างกันโดยแหล่งกำเนิดอยู่ที่มุมซ้ายล่าง ดังนั้นเมื่อควอตซ์วาดพิกเซล x [5], y [10] ของภาพ 100 * 100 พิกเซลนั้นจะถูกวาดที่มุมซ้ายล่างแทนที่จะเป็นมุมบนซ้าย จึงทำให้เกิดภาพ 'พลิก'
ระบบพิกัด x ตรงกับดังนั้นคุณจะต้องพลิกพิกัด y
CGContextTranslateCTM(context, 0, image.size.height);
ซึ่งหมายความว่าเราได้แปลภาพโดย 0 หน่วยบนแกน x และตามความสูงของภาพบนแกน 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);