9 Stimmen

Core Image: Nach der Verwendung von CICrop wird die Anwendung eines Compositing-Filters nicht richtig ausgerichtet

Ich verwende CICrop, um ein Bild auf eine bestimmte Größe zuzuschneiden, indem ich den oberen und unteren Teil des Bildes abschneide.

Anschließend wende ich etwas wie den Filter CIMultiplyCompositing an, um das beschnittene Bild mit einem anderen Bild zu kombinieren.

Beide Bilder haben die gleiche Größe, aber das Ergebnis zeigt, dass die beiden Bilder nicht übereinstimmen... eines ist versetzt.

Ich habe also Folgendes überprüft:

NSLog(@"image after crop: %g, %g, %g, %g", imageToFilter.extent.origin.x,
                       imageToFilter.extent.origin.y,
                       imageToFilter.extent.size.width,
                       imageToFilter.extent.size.height);

NSLog(@"second image: %g, %g, %g, %g", secondImage.extent.origin.x,
                       secondImage.extent.origin.y,
                       secondImage.extent.size.width,
                       secondImage.extent.size.height);

Das zeigt, dass der origin.y des beschnittenen Bildes den Versatz hat, den ich sehe (ein Ergebnis der Verwendung von CICrop):

image after crop: 0, 136, 3264, 2176
second image: 0, 0, 3264, 2176

Gibt es also eine Möglichkeit für mich, das "extent"-Rect des beschnittenen Bildes zurückzusetzen, so dass origin.y Null ist? Überprüfen Sie die Dokumente für CIImage, "Ausmaß" ist eine nur lesen Eigenschaft.

Oder werde ich einige schrecklich ineffiziente Konvertierung zu einem anderen Bildtyp/Rohdaten und dann zurück zu einem CIImage tun müssen?

Danke für jeden Rat.

17voto

Jim Rhoades Punkte 3238

Ich habe die Antwort auf diese Frage gefunden... und sie ist ganz einfach. Ich brauchte nur eine "Translation"-Transformation auf das CIImage anzuwenden, nachdem ich es beschnitten hatte, etwa so:

imageToFilter = [imageToFilter imageByApplyingTransform:CGAffineTransformMakeTranslation(0, -imageToFilter.extent.origin.y)];

Dadurch wird der y-Ursprung auf 0 zurückgesetzt.

2voto

emrahgunduz Punkte 1374

Sie können dies auch als Erweiterung verwenden. Für Swift:

import CoreImage

extension CIImage {
  var correctedExtent: CIImage {
    let toTransform = CGAffineTransform(translationX: -self.extent.origin.x, y: -self.extent.origin.y)
    return self.transformed(by: toTransform)
  }
}

Und Sie können als verwenden:

let corrected = ciImage.correctedExtent

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X