Почему мой код рисования продолжает приводить к нечетким формам?
Независимо от того, что я делаю, я не могу понять, почему мои изображения нечеткие на дисплеях 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)
В противном случае создаваемый вами контекст будет иметь в четыре раза больше пикселей, чем экран при соответствующем объеме пространства.