Pergunta

Eu estou girando minha imagem com o seguinte código:

CGAffineTransform rotate = CGAffineTransformMakeRotation( [ratio floatValue] );
[imageView setTransform:rotate];

Mas ele não tem bordas afiadas, alguém sabe uma solução para isso?

Aqui está a imagem que eu recebo:

enter descrição da imagem aqui

Foi útil?

Solução

As bordas da imagem em si parecem irregulares porque eles estão sendo colocados em uma grade de pixels diretamente, e não serem interpolados. vizinho mais próximo interpolação é o tipo mais simples de interpolação, onde se tem de pixel grade A e você mover sua imagem para grade de pixels B, os pixels na grade B são escolhidos simplesmente escolhendo o pixel mais próximo da grade A. Outras formas de interpolação escolher uma média ponderada dos pixels mais próximos para chegar ao valor de pixel na grade B.

A sua imagem, com suas bordas irregulares, parece que está usando interpolação vizinho mais próximo, que pode ser o tipo padrão de interpolação em uma transformação afim em um iPhone.

Quando você usa algum outro esquema de interpolação diferente do vizinho mais próximo, você vai ter aliasing efeitos, onde o subsampling não é perfeito como você transferir de uma grade de pixels para outro. Esse efeito faz com bordas na imagem em si parece desfocada do que deveriam.

Outras dicas

Usando CALayer do UIImageView para rasterizar a imagem irá fornecer o melhor anti-aliasing.

imageView.layer.shouldRasterize = YES;

basta adicionar 1px fronteira transparente para sua imagem

CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height);
UIGraphicsBeginImageContext( imageRect.size ); 
[image drawInRect:CGRectMake(1,1,image.size.width-2,image.size.height-2)];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Sempre que você fazer transformadas em uma imagem (exceto em incrementos de 90 °) que vai causar bordas ligeiramente mais suaves devido a interpolação de pixel.

Há uma chave que você pode definir em Info.plist que permite a suavização das bordas:. UIViewEdgeAntialiasing

Como descrito na resposta seguinte: Quando eu rodar um UIImageView com a propriedade transformar, as bordas pixellate

A solução mais simples:

Basta adicionar este par de valor-chave para o seu Info.plist: UIViewEdgeAntialiasing definida como Sim.

https://stackoverflow.com/a/12066215/1469060

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top