Навіть після застосування всього, що я згадав, у мене все ж були драми із зображеннями. Зрештою, я щойно використав Gimp, щоб створити "перевернуту вертикальну" версію всіх моїх зображень. Тепер мені не потрібно використовувати будь-які перетворення. Сподіваємось, це не спричинить подальших проблем на шляху.
Хтось знає, чому CGContextDrawImage малював моє зображення догори дном? Я завантажую зображення із своєї програми:
Quartz2d використовує іншу систему координат, де походження знаходиться в лівому нижньому куті. Отже, коли Quartz малює піксель 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);