Domanda

Sto avendo molto tempo a trovare qualsiasi documentazione online che spiega chiaramente come implementare correttamente il filtro CiPerspectiveTransform dell'immagine principale. In particolare, quando impostare i valori di civector per inputTopLeft, inputTopRight, inputBottomRight e inputBottomLeft, quali sono questi vettori che fanno l'immagine? (Cioè, qual è la matematica alle spalle come questi vettori avvertono la mia immagine?)

Attualmente questo è il codice che sto usando. Non si blocca, ma non mostra un'immagine:

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

altre cose da notare che potrebbe essere importante:

    .
  • La mia uiimageview (75pts x 115 pts) è già inizializzata tramite AwakeFromnib e ha già un'immagine (151px x 235px) associata ad essa.

  • Il codice sopra viene implementato nella funzione - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event UIimageView. La speranza è che sarò in grado di regolare la prospettiva dell'immagine basata su coordinate dello schermo in modo che sembri che l'immagine si stia muovendo nello spazio 3D.

  • Questo codice è per un'app per iPhone.

    Ancora una volta, la domanda penso che sto chiedendo è ciò che fanno i vari vettori dei parametri, ma potrei chiedere la domanda sbagliata.

    Il post seguente è molto simile ma chiede perché la sua immagine scompare piuttosto che usare i civectors per CiperspectiveTransform. Ha anche ricevuto pochissima trazione, forse perché è troppo generale: Come posso utilizzare il filtro CiPerspectiveTransform

È stato utile?

Soluzione

Come ho commentato la domanda collegata, CiperspectiveTransform è non disponibile nell'IOS Implementazione dell'immagine centrale a partire da iOS 5.1 . Ecco perché tu e l'altro Asker non stava vedendo alcuna immagine come risultato, perché molto probabilmente il tuo cifilter era nil.

Se vuoi solo implementare una forma di prospettiva su un'immagine, ci sono due diversi modi veloci per farlo su iOS, come descrivo in Questa risposta . Uno deve semplicemente usare il giusto tipo di catransform3d sullo strato di un uiimageview, ma questo è utile solo per il display, non Per la regolazione dell'immagine.

Il secondo modo è quello di manipolare l'immagine utilizzando una matrice di trasformazione 3-D appropriata in OpenGL ES. Come indico nella risposta sopra collegata, ho un quadro open source che avvolge tutto questo, e Il campione Filtershowcase ha un esempio di applicare una prospettiva al video in entrata. Puoi facilmente scambiare l'ingresso video con l'immagine e prendere un'immagine da quella dopo l'applicazione dell'effetto prospettiva.

Altri suggerimenti

Oooold post ma scommetto che qualcuno cercherà ancora questo tipo di filtro:

Il seguente func applica il filtro su un'immagine e restituisce la stessa immagine con la prospettiva cercando di creare un effetto di riflessione con la prospettiva. (L'immagine seguente è solo un esempio e non il risultato del test reale)

 Esempio di effetto specchio

Questo è un esempio, quindi hai bisogno di alcune regolazioni. Lo scopo è creare un'immagine che sembra essere un riflesso del "principale".

Quindi ho aggiunto due viste di immagini alla mia vista come nell'immagine. Aggiunti vincoli, ecc.

Poi nella func, vedrai che le coordinate sono hardcoded in modo che l'immagine di ritorno abbinerà perfettamente il suo contenitore, la parte inferiore uiimageview.

 Inserire l'immagine Descrizione qui

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
}
.

Per questo particolare effetto (specchio) potresti voler aggiungere altri effetti, come un gradiente, cambiare l'alfa, ecc.

Happy CoDing! Spero che aiuti

Spero che aiuti!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top