Почему мой код рисования продолжает приводить к нечетким формам?

Независимо от того, что я делаю, я не могу понять, почему мои изображения нечеткие на дисплеях iOS. Не имеет значения, был ли он создан в редакторе изображений или в коде чертежа, но я подумал, что этот код значительно облегчит анализ. Я знаю, что если линия имеет ширину 1 пиксель, она будет выглядеть нечеткой, но я пробовал несколько размеров ширины линии с похожими результатами. Что я могу сделать, чтобы мои графики выглядели четкими?

UIGraphicsBeginImageContext(CGSizeMake(1000, 1000));
    UIBezierPath *bezier = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 1000, 1000)];
    [[UIColor greenColor]set];
    [bezier fill];
    [[UIColor blackColor]set];
    bezier = [UIBezierPath bezierPath];
    [bezier setLineWidth:1.5]; //I tried .5, 1, 1.5, & 2 with similar results
    [bezier moveToPoint:CGPointMake(450, 500)];
    [bezier addLineToPoint:CGPointMake(500, 400)];
    [bezier addLineToPoint:CGPointMake(550, 500)];
    [bezier closePath];
    [bezier stroke];

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

1 ответ

Решение

UIGraphicsBeginImageContext:

... эквивалентно вызову UIGraphicsBeginImageContextWithOptions функция с непрозрачным параметром, установленным в NO и масштабный коэффициент 1.0,

Тем не мение, UIGraphicsBeginImageContextWithOptions определяет его scale параметр как:

масштаб
Масштабный коэффициент, применяемый к растровому изображению. Если вы укажете значение 0.0, масштабный коэффициент устанавливается на масштабный коэффициент основного экрана устройства.

Так что ваше использование UIGraphicsBeginImageContextWithOptions создает контекст со шкалой 1.0, Это верно, например, для прошлогоднего iPad Mini, но все устройства класса Retina имеют "родную" шкалу 2.0 - два пикселя на логическую точку. UIGraphicsBeginImageContextWithOptions представил особый случай 0.0 так что вам не придется возиться с получением правильного номера для этого устройства для себя (хотя [[UIScreen mainScreen] scale] было бы простым способом).

Так что переключите свой выходной вызов на UIGraphicsBeginImageContext(CGSizeMake(1000, 1000)) чтобы:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1000, 1000), NO, 0.0)

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

Другие вопросы по тегам