web-dev-qa-db-ja.com

UiimagePickerControllerからUIImageの画像をミラー化する方法

画像をミラー化する方法があるかどうかを把握しようとしています。たとえば、誰かの顔の写真を撮り、半分にカットして、自分の顔のように見えるものを見せてください。 cgaffinetransform関数では、このようなトリックがあるようです。グラフィックスエキスパートは助けてください!

17
Terry

ここでの基本的な「トリック」は、-1の要因を持つxまたはy軸の周りのスケーリング変換を使用することです。たとえば、これを使用して「水平軸に関するフリップ」変換を作成できます。

CGAffineTransform transform = CGAffineTransformScale(transform, -1, 1);
 _

その後、transformUIImageView _プロパティを設定して、割り当てられた画像を反転するか、さらに洗練された効果を得るために別の変換と連結することができます。説明した正確な効果を得るためには、元の画像をコンテキストに描画するためにいくつかのカスタム描画コードを作成する必要があるかもしれません、そしてそれの上に反転する半分をオーバーレイします。これはコアグラフィックスで比較的簡単です。

39
warrenm

上記の答えのどれも、画像全体を反転させない画像の半分をミラーリングしている質問の部分に対応しません。解をミキシングすると、UIImage +ミラーリングなどのカテゴリとして使用できるサンプル機能が次のようになります。

(UIImage *) horizontalMirror {
    UIImageOrientation flippedOrientation = UIImageOrientationUpMirrored;
    switch (self.imageOrientation) {
        case UIImageOrientationUp: break;
        case UIImageOrientationDown: flippedOrientation = UIImageOrientationDownMirrored; break;
    }
    UIImage * flippedImage = [UIImage imageWithCGImage:self.CGImage scale:1.0 orientation:flippedOrientation];

    CGImageRef inImage = self.CGImage;
    CGContextRef ctx = CGBitmapContextCreate(NULL,
                                             CGImageGetWidth(inImage),
                                             CGImageGetHeight(inImage),
                                             CGImageGetBitsPerComponent(inImage),
                                             CGImageGetBytesPerRow(inImage),
                                             CGImageGetColorSpace(inImage),
                                             CGImageGetBitmapInfo(inImage)
                                             );
    CGRect cropRect = CGRectMake(flippedImage.size.width/2, 0, flippedImage.size.width/2, flippedImage.size.height);
    CGImageRef TheOtherHalf = CGImageCreateWithImageInRect(flippedImage.CGImage, cropRect);
    CGContextDrawImage(ctx, CGRectMake(0, 0, CGImageGetWidth(inImage), CGImageGetHeight(inImage)), inImage);

    CGAffineTransform transform = CGAffineTransformMakeTranslation(flippedImage.size.width, 0.0);
    transform = CGAffineTransformScale(transform, -1.0, 1.0);
    CGContextConcatCTM(ctx, transform);

    CGContextDrawImage(ctx, cropRect, TheOtherHalf);

    CGImageRef imageRef = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    UIImage *finalImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return finalImage;
}
 _
5
Ali Nadalizadeh