Filtro CIPerspectiveTransform da imagem principal:Como usar CIVectors?
-
12-12-2019 - |
Pergunta
Estou tendo muita dificuldade em encontrar qualquer documentação on-line que explique claramente como implementar corretamente o filtro CIPerspectiveTransform do Core Image.Em particular, ao definir valores CIVector para inputTopLeft
, inputTopRight
, inputBottomRight
, e inputBottomLeft
, o que esses vetores estão fazendo com a imagem?(Ou seja, qual é a matemática por trás de como esses vetores distorcem minha imagem?)
Atualmente este é o código que estou usando.Não trava, mas não mostra imagem:
CIImage *myCIImage = [[CIImage alloc] initWithImage:self.image];
CIContext *context = [CIContext contextWithOptions:nil];
CIFilter *filter = [CIFilter filterWithName:@"CIPerspectiveTransform" keysAndValues:@"inputImage", myCIImage, @"inputTopLeft", [CIVector vectorWithX:118 Y:484], @"inputTopRight", [CIVector vectorWithX:646 Y:507], @"inputBottomRight", [CIVector vectorWithX:548 Y:140], @"inputBottomLeft", [CIVector vectorWithX:155 Y:153], nil];
CIImage *outputImage = [filter outputImage];
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]];
UIImage *transformedImage = [UIImage imageWithCGImage:cgimg];
[self setImage:transformedImage];
CGImageRelease(cgimg);
Outras coisas a serem observadas que podem ser importantes:
Meu UIImageView (75pts x 115 pts) já foi inicializado via wakeFromNib e já possui uma imagem (151px x 235px) associada a ele.
O código acima está sendo implementado no UIImageView's
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
função.A esperança é poder ajustar a perspectiva da imagem com base nas coordenadas da tela para que pareça que a imagem está se movendo no espaço 3D.Este código é para um aplicativo para iPhone.
Novamente, a pergunta que estou fazendo é o que os vários vetores de parâmetros fazem, mas posso estar fazendo a pergunta errada.
A postagem a seguir é muito semelhante, mas pergunta por que sua imagem desaparece em vez de como usar CIVectors para CIPerspectiveTransform.Também recebeu muito pouca tração, talvez por ser muito geral:Como posso usar o filtro CIPerspectiveTransform
Solução
Como comentei a questão vinculada, CIPerspectiveTransform é não disponível na implementação iOS do Core Image a partir do iOS 5.1.É por isso que você e o outro solicitante não estavam vendo nenhuma imagem, porque provavelmente seu CIFilter era nulo.
Se você deseja apenas implementar uma forma de perspectiva em uma imagem, existem duas maneiras diferentes e rápidas de fazer isso no iOS, conforme descrevo em esta resposta.Uma delas é simplesmente usar o tipo certo de CATransform3D na camada de um UIImageView, mas isso só é útil para exibição, não para ajuste de imagem.
A segunda maneira é manipular a imagem usando uma matriz de transformação 3D apropriada no OpenGL ES.Como indico na resposta acima, tenho uma estrutura de código aberto isso envolve tudo isso, e o exemplo FilterShowcase tem um exemplo de aplicação de uma perspectiva ao vídeo recebido.Você pode facilmente trocar a entrada de vídeo pela sua imagem e capturar uma imagem depois que o efeito de perspectiva for aplicado.
Outras dicas
Ooooo post antigo, mas aposto que alguém ainda procurará esse tipo de filtro:
A função a seguir aplica o filtro a uma imagem e retorna a mesma imagem com perspectiva tentando criar um efeito de reflexo com perspectiva.(A imagem a seguir é apenas um exemplo e não o resultado de testes reais)
Este é um exemplo, então você precisa de alguns ajustes.O objetivo é criar uma imagem que pareça ser um reflexo da “principal”.
Então adicionei duas visualizações de imagem à minha visualização, como na imagem.Restrições adicionadas, etc.
Então, na função, você verá que as coordenadas estão codificadas para que a imagem retornada corresponda perfeitamente ao seu contêiner, o UIImageView inferior.
func applyperspectiveTransform(imagen: UIImage) -> UIImage
{
var context = CIContext()
var outputImage = CIImage()
var newUIImage = UIImage()
let leftTop = CGPoint(x: self.ImgView.frame.origin.x, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
let leftBottom = CGPoint(x: self.ImgReflection.frame.origin.x, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)
let rightTop = CGPoint(x: self.ImgView.frame.origin.x + self.ImgView.frame.size.width, y: self.ImgReflection.frame.origin.y + self.ImgReflection.frame.size.height)
let rightBottom = CGPoint(x: self.ImgReflection.frame.origin.x + self.ImgReflection.frame.size.width, y: self.ImgView.frame.origin.y + self.ImgView.frame.size.height)
let lT = CIVector(x: leftTop.x, y: leftTop.y)
let lB = CIVector(x: leftBottom.x, y: leftBottom.y)
let rT = CIVector(x: rightTop.x, y: rightTop.y)
let rB = CIVector(x: rightBottom.x, y: rightBottom.y)
let aCIImage = CIImage(image: imagen)
context = CIContext(options: nil);
let perspectiveTransform = CIFilter(name: "CIPerspectiveTransform")!
perspectiveTransform.setValue(lB,forKey: "inputTopLeft")
perspectiveTransform.setValue(rB,forKey: "inputTopRight")
perspectiveTransform.setValue(rT,forKey: "inputBottomRight")
perspectiveTransform.setValue(lT,forKey: "inputBottomLeft")
perspectiveTransform.setValue(aCIImage,forKey: kCIInputImageKey)
outputImage = perspectiveTransform.outputImage!
let cgimg = context.createCGImage(outputImage, from: outputImage.extent)
newUIImage = UIImage(cgImage: cgimg!)
return newUIImage
}
Para este efeito específico (espelho), você pode querer adicionar mais alguns efeitos, como um gradiente, alterar o alfa, etc.
Boa codificação!Espero que ajude
Espero que ajude!