Подтвердить что ты не робот

Uiimage из UIView: выше разрешения на экране?

У меня есть UIView, который я передаю UIImage с помощью типичного метода UIGraphicsBeginImageContextWithOptions с использованием шкалы 2.0, поэтому вывод изображения всегда будет "версией отображения сетчатки", отображаемой на экране, независимо от того, фактическое разрешение экрана пользователя.

В UIView я рендеринг содержит как изображения, так и текст (UIImages и UILabels). Изображение появляется в визуализированном UIImage при полном разрешении и выглядит великолепно. Но UILabels, похоже, были растрированы в масштабе 1,0, а затем увеличены до 2,0, что приводит к размытому тексту.

Есть ли что-то, что я делаю неправильно, или есть какой-то способ заставить текст сделать красивым и четким на более высоком уровне шкалы? Или есть ли способ сделать это иначе, чем использовать параметр масштабирования UIGraphicsBeginImageContextWithOptions, который будет иметь лучшие результаты? Спасибо!

4b9b3361

Ответ 1

Решение состоит в том, чтобы изменить надпись labelScale до 2, прежде чем вы его нарисуете, а затем сразу же установите его обратно. Я просто закодировал проект, чтобы проверить его, и его работа прекрасна, создавая 2x изображение в обычном телефоне сетчатки (симулятор). [Если у вас есть общественное место, я могу сказать, что дайте мне знать.]

РЕДАКТИРОВАТЬ: расширенный код перемещает подзоны и любые контейнеры UIViews для установки/отмены шкалы

- (IBAction)snapShot:(id)sender
{
    [self changeScaleforView:snapView scale:2];

    UIGraphicsBeginImageContextWithOptions(snapView.bounds.size, snapView.opaque, 2);
    [snapView.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    imageDisplay.image = img; // contentsScale
    imageDisplay.contentMode = UIViewContentModeScaleAspectFit;

    [self changeScaleforView:snapView scale:1];
}

- (void)changeScaleforView:(UIView *)aView scale:(CGFloat)scale
{
    [aView.subviews enumerateObjectsUsingBlock:^void(UIView *v, NSUInteger idx, BOOL *stop)
        {
            if([v isKindOfClass:[UILabel class]]) {
                v.layer.contentsScale = scale;
            } else
            if([v isKindOfClass:[UIImageView class]]) {
                // labels and images
                // v.layer.contentsScale = scale; won't work

                // if the image is not "@2x", you could subclass UIImageView and set the name of the @2x
                // on it as a property, then here you would set this imageNamed as the image, then undo it later
            } else
            if([v isMemberOfClass:[UIView class]]) {
                // container view
                [self changeScaleforView:v scale:scale];
            }       
        } ];
}

Ответ 2

Попробуйте выполнить рендеринг изображения с двойным размером, а затем создайте масштабированное изображение:

UIGraphicsBeginImageContextWithOptions(size, NO, 1.0);
// Do stuff
UImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

newImage=[UIImage imageWithCGImage:[newImage CGImage] scale:2.0 orientation:UIImageOrientationUp];

Где: size = realSize * шкала;

Ответ 3

Я столкнулся с такими же странностями в контексте textview для рендеринга PDF. Я узнал, что есть некоторые документальные свойства объектов CALayer, которые составляют представление. Возможно, настройка растеризацииScale соответствующего (вспомогательного) слоя (ов) помогает.