2009-12-07 2 views
0

мне нужно маски «текстура» изображение с повернуто полутонового изображения.антиалайзинговые повернутых CGImage/CGlayer кажется зазубренным, UIImageView не являются

я узнал, что я должен делать это с CGImages или CGlayers (если есть способ проще, используя UIImageViews только, пожалуйста, дайте мне знать об этом).

Моя проблема проста:

В Сглаживании любого вращения трансформированной CG материала тихо зазубренного ...

... но антиалайзинговые из ротационно-преобразованный UIImageView является совершенно совершенным. Как я могу изготовить эти красивые сглаженные вращения?

Я загрузил "доказательство" с участием реальных iPhone Simulator скриншоты, чтобы увидеть, что я мелешь: http://gotoandplay.freeblog.hu/files/Proof.png

Я пытался использовать CGImages, CGLayers, UIImageViews " захватили»с renderInContext, я пытался CGContextSetInterpolationQuality к высокому, а также попытался установить CGContextSetAllowsAntialiasing - CGContextSetShouldAntialias, но каждый случай возвратил тот же самый неровный результат.

В следующем году я планирую изучить OpenGL, но эта разработка должна быть выпущена только с использованием CoreGraphics. Пожалуйста, дайте мне знать, как получить отлично обработанное изображение, я просто не могу согласиться с тем, что это невозможно.

+0

Никто не знает ... – Geri

+0

Привет, geri, вы нашли какое-либо решение этой проблемы? Я столкнулся с аналогичными проблемами здесь: http://stackoverflow.com/questions/2590470/how-do--remove-those-rotation-artefacts-from-my-catiledlayer – FelixLam

+0

Ya. Каждое решение было действительно требовательным к производительности, поэтому я решил изучить API OpenGL ES. Это не так уж и важно, и игра становится действительно гладкой как в антиалиасах, так и в производительности. – Geri

ответ

0

Вы пытались добавить прозрачную рамку на 1 пиксель вокруг своего изображения? Я слышал об этом, рекомендованном в качестве трюка, чтобы избежать наложения псевдонимов, предоставив CoreGraphics некоторое пространство для работы при смешивании краев.

1

Чтобы добавить 1px прозрачную границу к использованию изображение

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); 
UIGraphicsBeginImageContext(imageRect.size); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)]; 
image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
0

я с подобной проблемой, похоже, что я собираюсь переместить его к OpenGL ES, а также. Я не могу прибить эффективное решение, которое не повредит работе.

Для справки будущих исследователей CoreGraphics, положив прозрачную рамку с 1 пикселем, я сделал заметное улучшение в своих экспериментах, но, похоже, как упоминалось в Eonil, вы получаете несколько этапов сглаживания/сглаживания/интерполяции, друг друга. IE: CGLayer делает некоторую интерполяцию для его вращения, затем контекст, на который он нарисован, будет делать некоторую интерполяцию/сглаживание, так что так далее, пока он не окажется довольно грубым.

Я на самом деле получил лучшие результаты, отключив интерполяцию и сглаживание в контексте назначения, хотя он все еще был явно неровным (в общем случае, меньше артефактов).Я смог добиться наилучшего общего внешнего вида, включив интерполяцию и сглаживание при построении CGLayer и отключив его для контекста назначения при повторном рисовании. Очевидно, этот подход чреват другими проблемами.