UIImage нарисовано в CALayer слишком размыто - PullRequest
2 голосов
/ 04 ноября 2010

У меня есть некоторые проблемы с получением UIImage, который я рисую внутри CALayer, чтобы показать его без размытия Я помещаю изображение размером 400x300 пикселей в слой формата 123x89. Масштаб этого должен означать, что полученный CALayer является относительно острым, но это не так.

Это код, который я использую для рисования своего UIImage:

    CGSize s = image.size;
    CGRect r = CGRectInset (bounds, 8, 8);
    CGFloat scale = MIN (r.size.width / s.width, r.size.height / s.height);
    s.width *= scale; s.height *= scale;
    r.origin.x += (r.size.width - s.width) * .5;
    r.size.width = s.width;
    r.origin.y += (r.size.height - s.height) * .5;
    r.size.height = s.height;

    CGContextSaveGState (ctx);
    CGContextTranslateCTM (ctx, 0, bounds.size.height);
    CGContextScaleCTM (ctx, 1, -1);

    if (image != nil) {
        CGContextDrawImage (ctx, r, image.CGImage);
    }

    CGContextRestoreGState (ctx);

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

Спасибо

Джошуа Ли Такер.

Ответы [ 4 ]

9 голосов
/ 04 ноября 2010

Почему бы просто не установить свойство содержимого CALayer в CGImageRef и использовать свойство contentsGravity для определения масштабирования?Вы можете контролировать размер через рамку или границы CALayer.

myLayer.contentsGravity = kCAGravityResizeAspect;
myLayer.contents = (id) [myImage CGImage];
5 голосов
/ 30 октября 2014

Не забудьте установить значение contentsScale на CALayer, или вы можете обнаружить, что CGImage растянулся за пределы обзора до 2-кратного нормального размера на устройствах с сетчаткой. По какой-то причине масштаб по умолчанию для CALayers всегда равен 1,0, даже на устройствах Retina.

т.е.

layer.contentsScale = [UIScreen mainScreen].scale;

Кроме того, если вы рисуете фигуру с помощью CAShapeLayer и удивляетесь, что ее края выглядят немного неровно на устройствах с сетчаткой, попробуйте:

shapeLayer.rasterizationScale = [UIScreen mainScreen].scale;
shapeLayer.shouldRasterize = YES;
0 голосов
/ 04 ноября 2010

Изображения будут выглядеть нечеткими, если вы поместите их в нецелочисленные координаты или установите для ширины / высоты нецелое значение.Вы (потенциально) делаете обе вещи в своем коде.

Я думаю, что исправление для данного кода будет:

CGFloat scale = MIN (r.size.width / s.width, r.size.height / s.height);
s.width = trunc(s.width * scale); 
s.height = trunc(s.height * scale);
r.origin.x += trunc((r.size.width - s.width) * .5);
r.size.width = s.width;
r.origin.y += trunc((r.size.height - s.height) * .5);
r.size.height = s.height;
0 голосов
/ 04 ноября 2010

Я бы ожидал, что оно будет искажено.

Прежде всего, числа не делятся друг на друга равномерно.

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

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

...