Frage

Es fällt mir sehr schwer, online eine Dokumentation zu finden, die klar erklärt, wie der CIPerspectiveTransform-Filter von Core Image ordnungsgemäß implementiert wird.Insbesondere beim Festlegen von CIVector-Werten für inputTopLeft, inputTopRight, inputBottomRight, Und inputBottomLeft, was machen diese Vektoren mit dem Bild?(D.h. welche Mathematik steckt dahinter, wie diese Vektoren mein Bild verzerren?)

Derzeit ist dies der Code, den ich verwende.Es stürzt nicht ab, aber es wird kein Bild angezeigt:

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

Weitere Dinge, die Sie beachten sollten und die wichtig sein könnten:

  • Mein UIImageView (75 Punkte x 115 Punkte) ist bereits über wakeFromNib initialisiert und hat bereits ein damit verknüpftes Bild (151 x 235 Pixel).

  • Der obige Code wird in den UIImageViews implementiert - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event Funktion.Ich hoffe, dass ich die Perspektive des Bildes anhand der Bildschirmkoordinaten anpassen kann, sodass es aussieht, als würde sich das Bild im 3D-Raum bewegen.

  • Dieser Code ist für eine iPhone-App.

Auch hier denke ich, dass ich die Frage stelle, was die verschiedenen Parametervektoren bewirken, aber möglicherweise stelle ich die falsche Frage.

Der folgende Beitrag ist sehr ähnlich, fragt jedoch, warum sein Bild verschwindet, und nicht, wie man CIVectors für CIPerspectiveTransform verwendet.Es hat auch sehr wenig Anklang gefunden, vielleicht weil es zu allgemein ist:Wie ich den CIPerspectiveTransform-Filter verwenden kann

War es hilfreich?

Lösung

Wie ich die verlinkte Frage kommentiert habe, ist CIPerspectiveTransform In der iOS-Implementierung von Core Image ab iOS 5.1 nicht verfügbar.Aus diesem Grund haben Sie und der andere Fragesteller kein Bild gesehen, da Ihr CIFilter höchstwahrscheinlich gleich Null war.

Wenn Sie nur eine Art Perspektive auf ein Bild implementieren möchten, gibt es unter iOS zwei verschiedene schnelle Möglichkeiten, dies zu tun, wie ich in beschreibe diese Antwort.Eine besteht darin, einfach das zu verwenden richtige Art von CATransform3D auf der Ebene einer UIImageView, aber dies ist nur für die Anzeige nützlich, nicht für die Bildanpassung.

Die zweite Möglichkeit besteht darin, das Bild mithilfe einer geeigneten 3D-Transformationsmatrix in OpenGL ES zu manipulieren.Wie ich in der oben verlinkten Antwort angedeutet habe, habe ich ein Open-Source-Framework Das fasst das alles zusammen, und das FilterShowcase-Beispiel dort enthält ein Beispiel für die Anwendung einer Perspektive auf eingehendes Video.Sie können den Videoeingang ganz einfach mit Ihrem Bild austauschen und daraus ein Bild aufnehmen, nachdem der Perspektiveffekt angewendet wurde.

Andere Tipps

Oooooalter Beitrag, aber ich wette, jemand wird immer noch nach dieser Art von Filter suchen:

Die folgende Funktion wendet den Filter auf ein Bild an und gibt dasselbe Bild mit Perspektive zurück, wobei versucht wird, einen Reflexionseffekt mit Perspektive zu erzeugen.(Das folgende Bild ist nur ein Beispiel und nicht das Ergebnis echter Tests)

Example of mirror effect

Dies ist ein Beispiel, daher sind einige Anpassungen erforderlich.Der Zweck besteht darin, ein Bild zu erstellen, das das „Hauptbild“ widerzuspiegeln scheint.

Also habe ich meiner Ansicht wie im Bild zwei Bildansichten hinzugefügt.Einschränkungen usw. hinzugefügt.

Dann werden Sie in der Funktion sehen, dass die Koordinaten fest codiert sind, sodass das zurückgegebene Bild perfekt zu seinem Container, dem unteren UIImageView, passt.

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
}

Für diesen speziellen Effekt (Spiegel) möchten Sie möglicherweise weitere Effekte hinzufügen, z. B. einen Farbverlauf, das Alpha ändern usw

Viel Spaß beim Codieren!Ich hoffe es hilft

Ich hoffe es hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top