Рисование вокруг CGContextRef для удаления пикселов
В настоящее время у меня есть графическая проблема с рисованием маленьких точек.
Я заметил, что в большинстве профессиональных приложений Календаря идентификатор календаря событий представляет собой небольшую точку, цвет которой соответствует цвету календаря событий.
Я действую в точке моего приложения, где мне нужно нарисовать ЛУЧШУЮ точку. Вот фото того, что я имею в виду.
Это может быть не заметно здесь, но цветная точка довольно неровная, когда она на моем телефоне. Я хотел бы удалить пикселизацию.
Я прошел учебник с сайта Рэя Вендерлиха: Ray Wenderlich Core Graphics.
Вот что я получил для рисования точки:
UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;
Так что это фактически реализует круг, но я добавил это, чтобы нарисовать маленькую линию вокруг круга, чтобы избавиться от пикселизации, но не идти.
CGPoint startPoint = CGPointMake(cell.imageViewPic.frame.origin.x, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
CGPoint endPoint = CGPointMake(cell.imageViewPic.frame.origin.x + cell.imageViewPic.frame.size.width - 1, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
UIColor* color = [UIColor blackColor];
CGContextSaveGState(contextRef);
CGContextSetLineCap(contextRef, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(contextRef, color.CGColor);
CGContextSetLineWidth(contextRef, 10.0);
CGContextMoveToPoint(contextRef, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(contextRef, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(contextRef);
CGContextRestoreGState(contextRef);
Все вместе выглядит так...
UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));
CGPoint startPoint = CGPointMake(cell.imageViewPic.frame.origin.x, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
CGPoint endPoint = CGPointMake(cell.imageViewPic.frame.origin.x + cell.imageViewPic.frame.size.width - 1, cell.imageViewPic.frame.origin.y + cell.imageViewPic.frame.size.height - 1);
UIColor* color = [UIColor blackColor];
CGContextSaveGState(contextRef);
CGContextSetLineCap(contextRef, kCGLineCapSquare);
CGContextSetStrokeColorWithColor(contextRef, color.CGColor);
CGContextSetLineWidth(contextRef, 10.0);
CGContextMoveToPoint(contextRef, startPoint.x + 0.5, startPoint.y + 0.5);
CGContextAddLineToPoint(contextRef, endPoint.x + 0.5, endPoint.y + 0.5);
CGContextStrokePath(contextRef);
CGContextRestoreGState(contextRef);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;
Круг по-прежнему нарисован, но "штрих" не рисуется.
Если кто-нибудь даст несколько советов, как решить эту проблему, пожалуйста, напишите!
2 ответа
Пикселизация происходит потому, что когда вы создаете контекст изображения, вы не учитываете масштаб экрана. Ваш код должен выглядеть примерно так (обратите внимание на 1-ю строку):
UIGraphicsBeginImageContextWithOptions(cell.imageViewPic.bounds.size, NO, [UIScreen mainScreen].scale)
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(contextRef, [[event calendar] CGColor]);
CGContextFillEllipseInRect(contextRef,(CGRectMake (0.f, 0.f, cell.imageViewPic.bounds.size.width, cell.imageViewPic.bounds.size.height)));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
cell.imageViewPic.image = image;
Обновление: как кто-то прокомментировал, вы можете перейти в 0
вместо [UIScreen mainScreen].scale
, Документы согласны:
Масштабный коэффициент, применяемый к растровому изображению. Если указать значение 0,0, коэффициент масштабирования будет установлен на коэффициент масштабирования главного экрана устройства.
Это тот же ответ, что и @Christian Di Lorenzo. Но это короче, более прямолинейно.
Изменить это:
UIGraphicsBeginImageContext(cell.imageViewPic.bounds.size);
К этому:
UIGraphicsBeginImageContextWithOptions(cell.imageViewPic.bounds.size, NO, [UIScreen mainScreen].scale);