Eu tenho um UIImage
que é UIImageOrientationUp
(retrato) que eu gostaria de rotação anti-horário em 90 graus (a paisagem). Eu não quero usar a CGAffineTransform
. Eu quero que os pixels da UIImage
posição realmente mudem. Estou usando um bloco de código (mostrado abaixo) originalmente destinado a redimensionar um UIImage
para fazer isso. Defino um tamanho de destino como o tamanho atual do, UIImage
mas recebo um erro:
(Erro): CGBitmapContextCreate: bytes / linha de dados inválidos: deve ser pelo menos 1708 para 8 bits / componente inteiro, 3 componentes, kCGImageAlphaPremultipliedLast.
(Não recebo um erro sempre que forneço um tamanho MENOR como o tamanho alvo BTW). Como rotacionar meus UIImage
90 graus no sentido anti-horário usando apenas as principais funções gráficas, preservando o tamanho atual?
-(UIImage*)reverseImageByScalingToSize:(CGSize)targetSize:(UIImage*)anImage
{
UIImage* sourceImage = anImage;
CGFloat targetWidth = targetSize.height;
CGFloat targetHeight = targetSize.width;
CGImageRef imageRef = [sourceImage CGImage];
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
if (bitmapInfo == kCGImageAlphaNone) {
bitmapInfo = kCGImageAlphaNoneSkipLast;
}
CGContextRef bitmap;
if (sourceImage.imageOrientation == UIImageOrientationUp || sourceImage.imageOrientation == UIImageOrientationDown) {
bitmap = CGBitmapContextCreate(NULL, targetHeight, targetWidth, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
} else {
bitmap = CGBitmapContextCreate(NULL, targetWidth, targetHeight, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
}
if (sourceImage.imageOrientation == UIImageOrientationRight) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
} else if (sourceImage.imageOrientation == UIImageOrientationLeft) {
CGContextRotateCTM (bitmap, radians(-90));
CGContextTranslateCTM (bitmap, -targetWidth, 0);
} else if (sourceImage.imageOrientation == UIImageOrientationDown) {
// NOTHING
} else if (sourceImage.imageOrientation == UIImageOrientationUp) {
CGContextRotateCTM (bitmap, radians(90));
CGContextTranslateCTM (bitmap, 0, -targetHeight);
}
CGContextDrawImage(bitmap, CGRectMake(0, 0, targetWidth, targetHeight), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* newImage = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
return newImage;
}
fonte
Respostas:
Que tal algo como:
fonte
Acredito que a maneira mais fácil (e segura de threads também) é:
Nota: Como o Brainware disse, isso modifica apenas os dados de orientação da imagem - os dados de pixel são intocados. Para alguns aplicativos, isso pode não ser suficiente.
Ou em Swift:
fonte
let img = UIImage(cgImage: myImage!.cgImage!, scale: UIScreen.main.scale, orientation: .right)
Confira o código simples e impressionante de Hardy Macia em: cut-scaling-and-rotating-uiimages
Apenas ligue
Obrigado Hardy Macia!
Cabeçalho:
Como o link pode morrer, aqui está o código completo
fonte
Por mais estranho que isso pareça, o código a seguir resolveu o problema para mim:
fonte
Uma função de rotação segura da linha é a seguinte (funciona muito melhor):
fonte
UIImageOrientationDown
.Eu tive problemas com todos os itens acima, incluindo a resposta aprovada. Eu converti a categoria de Hardy novamente em um método, pois tudo que eu queria era girar uma imagem. Aqui está o código e o uso:
E o uso:
Obrigado Hardy!
fonte
Girar a imagem em 90 graus (sentido horário / anti-horário)
Chamada de função -
Implementação:
fonte
Se você deseja adicionar um botão de rotação da foto que continuará girando a foto em incrementos de 90 graus, aqui está. (
finalImage
é uma UIImage que já foi criada em outro lugar.)fonte
Simples. Apenas mude a bandeira de orientação da imagem.
fonte
Aqui está uma extensão Swift para UIImage que gira a imagem por qualquer ângulo arbitrário. Usá-lo como este:
let rotatedImage = image.rotated(byDegrees: degree)
. Usei o código Objective-C em uma das outras respostas e removi algumas linhas que estavam incorretas (material da caixa girada) e o transformei em uma extensão para o UIImage.fonte
Extensão Swift 3 UIImage:
fonte
Versão Swift 4.2 da resposta do RawMean :
fonte
Eu tento esse código, ele funciona e foi extraído de http://www.catamount.com/blog/1015/uiimage-extensions-for-cutting-scaling-and-rotating-uiimages/
fonte
Pequenas alterações nas outras respostas baseadas no código de Hardy Macia. Não há necessidade de criar um
UIView
objeto inteiro simplesmente para calcular o retângulo delimitador da imagem girada. Basta aplicar uma transformação de rotação ao retângulo da imagem usandoCGRectApplyAffineTransform
.fonte
"tint uiimage greayscale" parece ser o Google-Fu apropriado para este
imediatamente eu recebo:
https://discussions.apple.com/message/8104516?messageID=8104516ꩄ
https://discussions.apple.com/thread/2751445?start=0&tstart=0
Como pintar uma imagem programaticamente no iPhone?
fonte
Gosto da elegância simples da
Peter Sarnowski
resposta, mas ela pode causar problemas quando você não pode confiar nosEXIF
metadados e coisas do gênero. Nas situações em que você precisa rotacionar os dados da imagem real, eu recomendaria algo como isto:O código acima pega uma imagem cuja orientação é
Landscape
(não se lembra se éLandscape Left
ouLandscape Right
) e a rotacionaPortrait
. É um exemplo que pode ser modificado para suas necessidades.Os principais argumentos com os quais você teria que brincar são
CGContextRotateCTM(context, M_PI_2)
onde você decide quanto deseja girar, mas depois precisa se certificar de que a imagem ainda seja desenhada na tela usandoCGContextTranslateCTM(context, 0, -640)
. Esta última parte é muito importante para garantir que você veja a imagem e não uma tela em branco.Para mais informações, consulte a fonte .
fonte
resize-a-uiimage-the-right-way explica alguns dos problemas que muitos exemplos de código têm para fazer isso e possui alguns trechos de código para ajudar a lidar com o UIImages - o método auxiliar privado no UIImage + resize.m aceita uma transformação para permitir rotação, então você só precisa expor isso como uma interface pública.
Esta é a licença desse arquivo:
fonte
Existe uma categoria UIImage extremamente eficiente chamada NYXImagesKit. Ele usa vDSP, CoreImage e vImage para ser o mais rápido possível. Tem uma categoria UIImage + Rotating que salvou meu dia :)
https://github.com/Nyx0uf/NYXImagesKit
fonte
Para Swift: Aqui está uma extensão simples para o UIImage:
( Fonte )
Use-o com:
O primeiro irá girar uma imagem e inverter se a opção estiver definida como verdadeira.
fonte