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

Foi útil?

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)

Example of mirror effect

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.

enter image description here

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!

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