Сглаживание повернутого CGImage / CGlayer кажется неровным, UIImageView не - PullRequest
0 голосов
/ 08 декабря 2009

Мне нужно замаскировать"текстурное" изображение с повернутым изображением в оттенках серого.

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

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

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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 20 февраля 2011

Чтобы добавить прозрачную рамку размером 1 пиксель к вашему изображению, используйте

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 голосов
/ 19 июня 2012

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

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

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

0 голосов
/ 28 декабря 2009

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

...