2010-06-27 19 views
15

'dan bir UIImage resmini nasıl yansıtabilirim Bir görüntüyü yansıtmanın herhangi bir yolu olup olmadığını anlamaya çalışıyorum. Örneğin, birisinin yüzünün resmini çek ve sonra ikiye böldü ve her bir tarafın aynalanmış yüzüyle nasıl göründüğünü göster. CGAffineTransform işlevlerinde böyle bir hile yok gibi görünüyor. Grafik uzmanları lütfen yardım edin!UIImagePickerController

cevap

34

Buradaki temel "hile", X veya Y ekseni hakkında -1 katsayısı ile bir ölçekleme dönüşümü kullanmaktır.

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

Sonra atanan resmi çevirmek için UIImageView üzerinde transform özelliğini ayarlayabilir veya yapmak dönüşümü başka bir ile bitiştirmek: Örneğin, bir "yatay eksen etrafında çevrilmesi" oluşturmak için bu kullanabilirsiniz dönüşümü daha sofistike efektler. Tanımladığınız tam etkiyi elde etmek için, orijinal görüntünüzü bir içeriğe çekmek için bazı özel çizim kodları yazmanız, ardından üstündeki ters yüzün üzerine gelmeniz gerekebilir. Bu Çekirdek Grafikte nispeten basittir.

+4

veya CGAffineTransformMakeScale yani picker.cameraViewTransform = CGAffineTransformMakeScale kullanımı (-1, 1) // hızlı – khunshan

+1

Mükemmel: çözüm karıştırma Örneğin UIImage + Yansıtma gibi bir kategori olarak kullanabilir, aşağıdaki örnek fonksiyonuna yol açar! Ben myImageView.transform = CGAffineTransformMakeScale (-1, 1); ' –

19

sadece outrageously uzun switch deyimi ile neden rahatsız 4.0+

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

Sen düşünebilir, destekleme planlıyorsanız?

? UIImage *flip = [UIImage imageWithCGImage:image.CGImage 
?          scale:image.scale 
?        orientation:(image.imageOrientation + 4) % 8]; 

Ve numaralama bakmak eğer modüler aritmetik yapacağını görebilirsiniz:

typedef NS_ENUM(NSInteger, UIImageOrientation) { 
    UIImageOrientationUp,   // default orientation 
    UIImageOrientationDown,   // 180 deg rotation 
    UIImageOrientationLeft,   // 90 deg CCW 
    UIImageOrientationRight,   // 90 deg CW 
    UIImageOrientationUpMirrored, // as above but image mirrored along other axis. horizontal flip 
    UIImageOrientationDownMirrored, // horizontal flip 
    UIImageOrientationLeftMirrored, // vertical flip 
    UIImageOrientationRightMirrored, // vertical flip 
}; 

Ama bu kodu çok zeki. Bunun yerine açık bir anahtar deyimiyle bir işlev yazmalısınız. Örneğin.

UIImageOrientation mirroredImageOrientation(UIImageOrientation orientation) { 
    switch(orientation) { 
     case UIImageOrientationUp: return UIImageOrientationUpMirrored; 
     case UIImageOrientationDown: return UIImageOrientationDownMirrored; 
     case UIImageOrientationLeft: return UIImageOrientationLeftMirrored; 
     case UIImageOrientationRight: return UIImageOrientationRightMirrored; 
     case UIImageOrientationUpMirrored: return UIImageOrientationUp; 
     case UIImageOrientationDownMirrored: return UIImageOrientationDown; 
     case UIImageOrientationLeftMirrored: return UIImageOrientationLeft; 
     case UIImageOrientationRightMirrored: return UIImageOrientationRight; 
     default: return orientation; 
    } 
} 

Ve böyle işlevini kullanın: Ben şüpheli, kötü kokulu kodunu belirtmek için soru işaretleri ekledik

UIImage *flip = [UIImage imageWithCGImage:image.CGImage 
            scale:image.scale 
           orientation:mirroredImageOrientation(image.imageOrientation)]; 

. The Practice of Programming

+1

kullanıyorum. Cevabınız iyi görünüyorsa, aslında her durumda değil. , ör. Yatay çevirme yapmak istiyorsanız ancak görüntü yöneliminiz doğruysa, LeftMirrored yapmalısınız, çünkü RightMirrored dikey çevirme yapacaktır. – AncAinu

+0

Yansıtılmamış yansıtılmış görünümden yansıtmak, görüntüyü yatay olarak yansıtır, koltuğunuzda oturduğunuz bakış açısıyla. (Doğru görüyorsunuz ki, görüntünün perspektifinden enumdaki ek açıklamalara göre dönecektir.) Yüzler doğru yönde (görüntünün başının tepesine) yönlendiriliyorsa, tüm dönüşümler yansıtılmamış olarak aynen bu yüzü yatay olarak çevirecektir (yani dikey eksende). UIImageOrientation belgeleri: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/#//apple_ref/c/tdef/UIImageOrientation. – sabalaba

+0

Açık bir anahtar ifadesi kullanmanızı önermek için cevabımı düzenledim. Yolda ne olacağını kim bilebilir? Belki Apple, enumun sırasını değiştirir, bu durumda modüler aritmetik versiyon yanlış olur. – sabalaba

5

'a benzer. Yukarıdaki cevapların hiçbiri, görüntünün yarısını yansıtmayan, resmin tamamını yansıtmayan soruya cevap vermez.

(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; 
} 
+0

Teşekkür etti – ChanWarde

İlgili konular