iOS: ошибка сглаживания (PNG в CALayer) - PullRequest
3 голосов
/ 14 августа 2011

Я пытаюсь нарисовать это изображение на экране:

src_image

Это код:

        CALayer* dullLayer = [CALayer layer];
        {                
            dullLayer.frame = CGRectMake(0,0,BUTTON_SIZE,BUTTON_SIZE);

            dullLayer.position = CGPointFromPoint2D( btnCenter );

            dullLayer.opacity = topQuadrant ? 1.0 : 0.5;


            [wheelLayer addSublayer: dullLayer];
        }


        UIImage* test = [UIImage imageNamed: @"OuterButton_Dull.png"];

        dullLayer.contents = (id) [test CGImage];

Вот что я получаю:

render_fail

Что дает? Почему края такие неровные? Сравните это с изображениями римских цифр, которые были скомпонованы так же, как и на экране.

Я пытался

            dullLayer.edgeAntialiasingMask = 0x0f; // binary 1111

безрезультатно.

РЕДАКТИРОВАТЬ: http://lists.apple.com/archives/cocoa-dev/2008/Feb/msg02070.html

Ответы [ 3 ]

5 голосов
/ 14 августа 2011

Если полученное изображение имеет тот же размер, что и на экране, тогда вы просто используете слишком большое изображение. Изображение PNG не является векторным изображением, поэтому его уменьшение всегда даст некоторый псевдоним; чем дальше вы уменьшаете, тем хуже становится. Сглаживание будет иметь ограниченный эффект в таких случаях.

Тот факт, что вы не видите его для цифровых изображений, отчасти объясняется тем, что он не содержит каких-либо тонких, высококонтрастных линий, как у другого изображения, и отчасти, возможно, из-за того, что вы используете для них меньшие изображения.

Если у вас есть исходное изображение как векторное изображение, попробуйте уменьшить его до нужного размера, прежде чем преобразовать его в PNG. Если вам нужна версия с более высоким разрешением где-то еще в вашем приложении, рассмотрите возможность создания нескольких PNG, каждый с различным разрешением.

Если у вас нет исходного изображения в качестве векторного изображения, попробуйте найти замену. В Интернете есть несколько хороших источников бесплатных файлов клипов, таких как http://www.openclipart.org/ или http://www.clker.com/.

.
4 голосов
/ 10 сентября 2011

Я только что написал об этом: http://kellenstyler.com/?p=1360

Есть несколько вещей, которые вы можете сделать, если вы добавите изображения с помощью кода вместе с несколькими трюками, которые позволят вам немного его почиститьБольше.

Посмотрите, поможет ли что-нибудь в следующем коде:

UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ];
CGRect imageRect = CGRectMake( 0 , 0 , img.size.width + 4 , img.size.height + 4 );
UIGraphicsBeginImageContext( imageRect.size );
[img drawInRect:CGRectMake( imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4 ) ];
CGContextSetInterpolationQuality( UIGraphicsGetCurrentContext() , kCGInterpolationHigh );
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[aliasImage setImage:img ];

aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45 );
aliasImage.layer.shouldRasterize = YES;
aliasImage.layer.rasterizationScale = 0.45;
aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
aliasImage.clipsToBounds = NO;
aliasImage.layer.masksToBounds = NO;
2 голосов
/ 14 августа 2011

Десмонд прибил его.

Кажется, что сглаживание в платформах Apple работает только на соседних пикселях. поэтому, если вы уменьшите изображение в 4 раза, пиксель 0,0 будет усреднен по пикселю 2,0, то есть пиксель 1,0 полностью отброшен. так что, если у вас есть острые края, это не поможет.

Решение состоит в том, чтобы многократно уменьшать изображение на 50%, пока оно не станет <2x желаемого размера. </p>

Вот что произойдет, если я постепенно уменьшу исходное изображение 600 x 600, уменьшая его вдвое и отображая результат в 256 x 256 CALayer:

progressive_reduction

Третье изображение фактически уменьшено до размера ниже целевого. Как ни странно, дальнейшее уменьшение (которое автоматически увеличивается до 75 -> 256 для отображения) на самом деле выглядит лучше всего.

Так что на самом деле в этом случае решение заключалось в том, чтобы уменьшить его до тех пор, пока оно фактически не станет меньше желаемого размера, а затем позволить графической структуре Apple расширить его по мере необходимости.

...