1

CoreImageのCIPerspectiveTransformフィルターを適切に実装する方法を明確に説明しているドキュメントをオンラインで見つけるのに非常に苦労しています。特に、、、、、およびのCIVector値を設定する場合、これらinputTopLeftのベクトルは画像に対して何をしますか?(つまり、これらのベクトルが私の画像を歪める方法の背後にある数学は何ですか?)inputTopRightinputBottomRightinputBottomLeft

現在、これは私が使用しているコードです。クラッシュしませんが、画像は表示されません。

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

重要かもしれない他の注意事項:

  • 私のUIImageView(75pts x 115 pts)は、すでにawakeFromNibを介して初期化されており、すでに画像(151px x 235px)が関連付けられています。

  • 上記のコードは、UIImageViewの- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event関数に実装されています。画面の座標に基づいて画像の遠近感を調整し、画像が3D空間で動いているように見せることができれば幸いです。

  • このコードはiPhoneアプリ用です。

繰り返しますが、私が尋ねていると思う質問は、さまざまなパラメーターベクトルが何をするかですが、間違った質問をしている可能性があります。

次の投稿は非常に似ていますが、CIPerspectiveTransformにCIVectorsを使用する方法ではなく、なぜ彼の画像が消えるのかを尋ねています。また、一般的すぎるためか、ほとんど牽引されていません 。CIPerspectiveTransformフィルターの使用方法

4

2 に答える 2

6

リンクされた質問にコメントしたように、CIPerspectiveTransformは、iOS5.1以降のCoreImageのiOS実装では使用できません。そのため、CIFilterがゼロであった可能性が高いため、結果としてあなたと他の質問者には画像が表示されませんでした。

画像にある種の遠近法を実装したいだけの場合、この回答で説明しているように、iOSでこれを行うには2つの異なる高速な方法があります。1つは、UIImageViewのレイヤーで適切な種類のCATransform3Dを使用することですが、これは表示にのみ役立ち、画像の調整には役立ちません。

2番目の方法は、OpenGLESの適切な3D変換行列を使用して画像を操作することです。上記のリンクされた回答で示したように、私はこれらすべてをラップするオープンソースフレームワークを持っており、そこにあるFilterShowcaseサンプルには、着信ビデオにパースペクティブを適用する例があります。ビデオ入力を画像と簡単に入れ替えて、遠近効果を適用した後、そこから画像を取得できます。

于 2012-05-20T22:16:19.523 に答える
0

Oooooldの投稿ですが、誰かがこの種のフィルターを探しているに違いありません。

次の関数は、フィルターを画像に適用し、遠近法で同じ画像を返し、遠近法で反射効果を作成しようとします。(次の画像は単なる例であり、実際のテストの結果ではありません)

ミラー効果の例

これは例であるため、いくつかの調整が必要です。目的は、「メイン」のイメージを反映しているように見えるイメージを作成することです。

そこで、画像のように2つの画像ビューをビューに追加しました。制約などを追加しました。

次に、関数で、座標がハードコーディングされているので、返される画像がそのコンテナである下部の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
}

この特定の効果(ミラー)では、グラデーション、アルファの変更など、さらにいくつかの効果を追加することができます。

ハッピーコーディング!それが役に立てば幸い

それが役に立てば幸い!

于 2018-12-14T17:40:09.607 に答える