Quaisquer técnicas de anti-aliasing rápidas e sujas para um UIImageView girado?

Eu tenho um UIImageView (full frame e retangular) que estou girando com um CGAffineTransform. O UIImage do UIImageView preenche todo o quadro. Quando a imagem é girada e desenhada, as bordas parecem visivelmente irregulares. Há algo que eu possa fazer para melhorar a aparência? É claro que não está sendo anti-aliased com o plano de fundo.

    Lembre-se de definir as opções de anti-alias apropriadas:

    CGContextSetAllowsAntialiasing(theContext, true); CGContextSetShouldAntialias(theContext, true); 

    As bordas das camadas CoreAnimation não são antialiased por padrão no iOS. No entanto, há uma chave que você pode definir no Info.plist que permite o antialiasing das arestas: UIViewEdgeAntialiasing.

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

    Se você não quiser a sobrecarga de desempenho de ativar essa opção, uma alternativa é adicionar uma borda transparente de 1 px ao redor da borda da imagem . Isso significa que as “bordas” da imagem não estão mais na borda, portanto, não precisa de tratamento especial!

    Nova API – iOS 6/7

    Também funciona para o iOS 6, conforme observado pelo @Chris, mas não foi divulgado até o iOS 7.

    Desde o iOS 7, o CALayer tem uma nova propriedade allowsEdgeAntialiasing que faz exatamente o que você quer neste caso, sem incorrer na sobrecarga de habilitá-lo para todas as visualizações em sua aplicação! Esta é uma propriedade do CALayer, portanto, para ativar isso para um UIView, use myView.layer.allowsEdgeAntialiasing = YES .

    basta adicionar uma borda transparente de 1px à sua imagem

     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(); 

    basta adicionar “Renderizações com antialiasing de borda” com YES em plist e ele funcionará.

    Eu recomendaria totalmente a seguinte biblioteca.

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

    Ele contém muitas extensões úteis para o UIImage que resolvem esse problema e também incluem código para gerar miniaturas etc.

    Apreciar!

    A melhor maneira que encontrei para ter bordas suaves e uma imagem nítida é fazer isso:

     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(); 

    Adicionando a chave Info.plist como algumas pessoas descrevem tem um grande sucesso no desempenho e se você usar isso, então você está basicamente aplicando-o a tudo, em vez de apenas o lugar que você precisa.

    Além disso, não use apenas UIGraphicsBeginImageContext(imageRect.size); caso contrário, a camada ficará desfocada. Você tem que usar UIGraphicsBeginImageContextWithOptions como eu mostrei.

    Eu encontrei esta solução daqui e é perfeita:

     + (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; } 

    uso:

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