コア画像CiperSpectiveTransformフィルタ:Civectorsの使い方?
-
12-12-2019 - |
質問
コアイメージのCiperSpectiveTransform filterを正しく実装する方法を明確に説明するマニュアルをオンラインで見つけることは非常に苦労しています。特に、inputTopLeft
、inputTopRight
、inputBottomRight
、およびinputBottomLeft
のCivector値を設定する場合、これらのベクトルは画像にしていますか? (すなわち、これらのベクトルがどのようにして私のイメージを歪める数学は何ですか?)
現在これは私が使用しているコードです。クラッシュするわけではありませんが、イメージを表示しません:
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);
.
それ以外のものが重要かもしれません:
-
My UiimageView(75pts x 115 PTS)はawakefromnibを介して初期化されており、すでにそれに関連付けられているイメージ(151px x 235px)を持っています。
-
上記のコードは、UIImageViewの
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
関数に実装されています。希望は、画面座標に基づいて画像の視点を調整できるようにするため、画像が3D空間で動いているように見えます。 -
このコードはiPhoneアプリのためのものです。
また、私が尋ねていると思う質問は、さまざまなパラメータのベクトルがすることですが、私は間違った質問をしているかもしれません。
次の投稿は非常に似ていますが、CiperSpectiveTransformのためにCivectorsを使用する方法ではなく、彼のイメージが消えている理由を尋ねています。それはまた一般的な牽引力を受け取りました、おそらく一般的なので: どのように私はCIPerspectiveTransformフィルタを使用することができますする
解決
リンクされた質問についてコメントしているように、CiperSpectiveTransformは IOSでは利用できませんIOS 5.1 現在のコアイメージの実装。それがあなたと他のアスカーが結果としてどのようなイメージを見ていなかったのか、私はあなたのCiFilterがnilでした。
画像に視点の形式を実装したい場合は、iosでこれを行うhttps://stackoverflow.com/a/10458680/ 19679 ">この答え。 1つは、右種のCatransform3D をUIimageViewのレイヤーで使用することですが、これはディスプレイにのみ役立ちます。画像調整用。
第2の方法は、OpenGL ESで適切な3次元変換行列を使用して画像を操作することです。私が上記の答えを示すので、私はすべてを折り返すオープンソースフレームワーク FilterShowCaseサンプルには、着信ビデオにパースペクティブを適用する例があります。あなたは簡単にあなたのイメージでビデオ入力を交換して、遠近効果が適用された後からの画像をつかむことができます。
他のヒント
Oooold Postしかし、私は誰かがまだこの種のフィルターを探すことになるとします:
次のFUNCはフィルタを画像に適用し、パースペクティブを展開しようとして同じイメージを返します。 (以下の画像は、実際のテストの結果ではなく例です)
これは一例であるため、調整が必要です。 その目的は、「メイン」を反映するように思われる画像を作成することです。
だから私は画像のように私のビューに2つの画像ビューを追加しました。制約などを追加しました。
FUNCでは、座標がハードコードされるように、座標がハードコードされるようになるため、戻る画像はそのコンテナ、下のUIImageViewを完全に一致させます。
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
}
.
この特定の効果(ミラー)には、グラデーションのように、いくつかの影響を追加したい場合は、アルファなどを変更してください。
ハッピーコーディング! を助けることを願っています
それが役立つことを願っています!