Вопрос по antialiasing, uiimage, uiimageview, iphone, cocoa-touch – Какие-нибудь быстрые и грязные методы сглаживания для повернутого UIImageView?

26

У меня есть UIImageView (полный кадр и прямоугольник), который я вращаю с помощью CGAffineTransform. UIImage UIImageView заполняет весь кадр. Когда изображение поворачивается и рисуется, края кажутся заметно неровными. Что я могу сделать, чтобы это выглядело лучше? Это явно не сглаживается с фоном.

и только края зазубренные ... само изображение сглаживает просто отлично. Meltemi
Является ли изображение внутренним сглаживанием - это просто зазубренные края или все это? Кстати, я бы порекомендовал использовать CALayer, если это возможно. hatfinch
ну в моём случае их нужно для просмотра нужно зарегистрировать касания Meltemi
Действительно, но зачем перевозить весь багаж UIView / UIResponder, если вам это не нужно? hatfinch
Это для iPhone, поэтому я считаю, что он уже поддерживается CALayer. Meltemi

Ваш Ответ

8   ответов
0

Я нашел это решение отВоти это идеально:

+ (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame transparentInsets:(UIEdgeInsets)insets {
    CGSize imageSizeWithBorder = CGSizeMake(frame.size.width + insets.left + insets.right, frame.size.height + insets.top + insets.bottom);
    // Create a new context of the desired size to render the image
    UIGraphicsBeginImageContextWithOptions(imageSizeWithBorder, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Clip the context to the portion of the view we will draw
    CGContextClipToRect(context, (CGRect){{insets.left, insets.top}, frame.size});
    // Translate it, to the desired position
    CGContextTranslateCTM(context, -frame.origin.x + insets.left, -frame.origin.y + insets.top);

    // Render the view as image
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    // Fetch the image
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();

    // Cleanup
    UIGraphicsEndImageContext();

    return renderedImage;
}

использование:

UIImage *image = [UIImage renderImageFromView:view withRect:view.bounds transparentInsets:UIEdgeInsetsZero];
5

Я бы полностью порекомендовал следующую библиотеку.

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

Он содержит множество полезных расширений для UIImage, которые решают эту проблему, а также включают в себя код для создания миниатюр и т. Д.

Наслаждайтесь!

9

Не забудьте установить соответствующие параметры сглаживания:

CGContextSetAllowsAntialiasing(theContext, true);
CGContextSetShouldAntialias(theContext, true);
Прозрачная граница 1px сделала свое дело! Meltemi
6

просто добавьте & quot; Рендеринг с сглаживанием краев & quot; с ДА в плисте и будет работать.

2

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

CGRect imageRect = CGRectMake(0, 0, self.photo.image.size.width, self.photo.image.size.height);
UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0);
[self.photo.image drawInRect:CGRectMake(1, 1, self.photo.image.size.width - 2, self.photo.image.size.height - 2)];
self.photo.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Добавление ключа Info.plist, как описывают некоторые люди, сильно сказывается на производительности, и если вы используете его, то вы в основном применяете его ко всему, а не к одному месту, где оно вам нужно.

Кроме того, не просто используйтеUIGraphicsBeginImageContext(imageRect.size); в противном случае слой будет размытым. Вы должны использоватьUIGraphicsBeginImageContextWithOptions как я показал.

17

просто добавьте прозрачную границу 1px к вашему изображению

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0);
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
спасибо, приятель & # x2014; работал лакомство
Это действительно сработало. Потрясающие.
26

New API – iOS 6/7

Also works for iOS 6, as noted by @Chris, but wasn't made public until iOS 7.

Начиная с iOS 7, CALayer имеет новое свойствоallowsEdgeAntialiasing который делает именно то, что вы хотите в этом случае, не тратя время на его включение для всех представлений в вашем приложении! Это свойство CALayer, поэтому, чтобы включить его для используемого вами UIViewmyView.layer.allowsEdgeAntialiasing = YES.

55

Края слоев CoreAnimation по умолчанию не сглаживаются в iOS. Однако есть ключ, который вы можете установить в Info.plist, который включает сглаживание краев: UIViewEdgeAntialiasing.

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html

Если вы не хотите, чтобы при включении этой опции были снижены показатели производительности, можно обойтидобавьте прозрачную границу в 1 пиксель по краю изображения, Это означает, что «края» изображения уже не на краю, поэтому не требуется особой обработки!

Похожие вопросы