UIImage को क्षैतिज रूप से कैसे फ्लिप करें?


111

UIImageक्षैतिज रूप से कैसे फ्लिप करें , मुझे कक्षा के संदर्भ UIImageOrientationUpMirroredमें गणना मूल्य मिला UIImage, कैसे इस संपत्ति का उपयोग फ्लिप करने के लिए किया जाए UIImage


अरथ के ठीक जवाब में जोड़ने के लिए, Apple इस लिंक
कोको

जैसा कि मेरे लिए स्वीकृत काम नहीं कर रहा था, मुझे यह श्रेणी मिली । एक जादू की तरह काम करता है।
dwbrito

जवाबों:


238

उद्देश्य सी

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];

UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];

तीव्र

let flippedImage = myImage.withHorizontallyFlippedOrientation()

14
इस जवाब के साथ दो समस्याएं हैं - स्केल रेटिना सक्षम छवियों पर 1.0 नहीं है और किसी कारण से UIImageOrientationUpकाम करते समय UIImageOrientationUpMirroredइसे फ्लिप नहीं किया। यह काम किया -image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]
कोफ

1
@ के रूप में मैंने देखा, जो अभिविन्यास पैरामीटर आप पास करते हैं उसका उपयोग यह निर्धारित करने के लिए किया जाता है कि 'इस विशिष्ट अभिविन्यास के साथ मुझे यह छवि देने के लिए' sourceImage का अभिविन्यास पहले से ही क्या है '। इसलिए, आप sourceImage.imageOrientation पैरामीटर का निरीक्षण कर सकते हैं और एक अलग अभिविन्यास में उत्तीर्ण कर सकते हैं कि आप जो चाहते हैं उसे देने के लिए विधि को ट्रिक करें
Ege Akpinar

6
sourceImage.scaleपैमाने के लिए उपयोग करना बेहतर होगा ।
सैम सोफेस

स्विफ्ट में यह कैसे करें? [UIImage imageWithCGImage ...] वहां उपलब्ध नहीं है।
लिम थोये बीन

3
यह पूरी तरह से टूट जाता है जब मैं करने की कोशिश करता हूं [flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]। कोई विचार क्यों?
devios1

70

इसे प्राप्त करने का एक बहुत ही सरल तरीका है कि आप UIImage के बजाय UIImageView बनाकर UIImageView पर रूपांतरण करें।

yourImageView.image =[UIImage imageNamed:@"whatever.png"];
yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped

उम्मीद है की यह मदद करेगा।


2
यह UIImageहेरफेर की तुलना में मेरे लिए बहुत बेहतर काम कर रहा था, जो मुझे मिला जब UIImageRenderingModeAlwaysTemplateरेंडरिंग मोड के साथ साइड इफेक्ट हुआ ।
devios1

2
इसे साझा करने के लिए आपको धन्यवाद। मुझे इस पोस्ट से जुड़ी इस पहेली के "जवाब" से कोई फ़ायदा नहीं था, लेकिन आपके जवाब ने बहुत अच्छा काम किया और यह केवल 1 लाइन का कोड था।
एड्रियन

बहुत अच्छा काम करता है! iOS 9+ में अब flipsForRightToLeftLayoutDirection भी शामिल है, लेकिन यह iOS 8+ ऐप्स के लिए अभी तक काम नहीं करेगा।

3
यदि आप फ़्लिपिंग को रीसेट करना चाहते हैं, तो उपयोग करेंyourImageView.transform = CGAffineTransformIdentity
8

UIImageView पर इस पद्धति को 'रूपांतरित' पर ध्यान दें। यह वास्तविक UIImage को फ्लिप नहीं करता है।
धीमी गति

36

वर्टिकल फ्लिप को अक्सर ओपनजीएल बनावट का उपयोग करने के लिए आवश्यक होता है glTexImage2d(...)। उपरोक्त प्रस्तावित चाल वास्तव में छवि डेटा को संशोधित नहीं करती है और इस मामले में काम नहीं करेगी। यहां https://stackoverflow.com/a/17909372 से प्रेरित वास्तविक डेटा फ्लिप करने के लिए एक कोड है

- (UIImage *)flipImage:(UIImage *)image
{
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0.,0., image.size.width, image.size.height),image.CGImage);
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return i;
}

1
यह कैसे फ्लिप छवि है? ऐसा लगता है कि यह छवि को फिर से खींचता है।
जोनाथन।

@Jonathan। मुझे लगता है कि यह ड्राइंग करते समय विभिन्न समन्वय प्रणालियों (यानी वाई अक्ष दिशा) के कारण फ़्लिप करता है।
एलेक्सी पोडलासोव

क्या छवि को लंबवत रूप से फ्लिप करने के लिए इसका उपयोग करने का कोई तरीका है?
प्रैक्सिटेल्स

यह विधि अच्छी तरह से छवि प्रतिपादन का भी समर्थन करती है - हमेशा टेम्पलेट
पीटर स्टैगर

3
गुणवत्ता के मुद्दे को ठीक करने के लिए, UIGraphicsBeginImageContextWithOptions (image.size, NO, image.scale) का उपयोग करें; बजाय।
निक लॉकवुड

14

मैंने ImageFlippedForRightToLeftLayoutDirection के साथ प्रयास किया है, और अलग-अलग झुकाव के साथ एक नया UIImage बना रहा हूं, लेकिन कम से कम यह एकमात्र समाधान है जो मैंने अपनी छवि को फ़्लिप करने के लिए पाया है

let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))

जैसा कि आप मेरे खेल के मैदान में देख सकते हैं यह काम किया !! :) यहां छवि विवरण दर्ज करें

और, ज़ाहिर है, फाइनलमेज = UIImage (CIImage: rotada3) दें


क्षमा करें, लेकिन ऐसा लगता है कि अब और काम नहीं कर रहा है, कम से कम कैमरे के साथ तस्वीरें ली
गईं

12

जैसा कि यह इमेज ओरिएंटेशन परिभाषित करता है:

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

मैंने अधिक परिस्थितियों के लिए कुछ सुधार किए जैसे कि AVCaptureSession से UIImage को संभालना।

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
UIImageOrientation flipingOrientation;
if(sourceImage.imageOrientation>=4){
    flippedOrientation = sourceImage.imageOrientation - 4;
}else{
    flippedOrientation = sourceImage.imageOrientation + 4;
}
UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                     scale: sourceImage.scale orientation: flipingOrientation];

9

यहाँ का तेज़ संस्करण है: (मैंने इस प्रश्न को टिप्पणियों में देखा)

let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)


7

यह क्षैतिज रूप से एक UIImage को दर्पण / फ्लिप करने के लिए एक ठोस कार्यान्वयन है, और छवि को आगे और पीछे लागू कर सकता है। चूंकि यह अंतर्निहित छवि डेटा को बदलता है, ड्राइंग (जैसे, स्क्रीनशॉट) भी बदल जाएगा। काम करने के लिए परीक्षण किया गया, कोई गुणवत्ता हानि नहीं हुई।

func flipImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let bitmap = UIGraphicsGetCurrentContext()!

        bitmap.translateBy(x: size.width / 2, y: size.height / 2)
        bitmap.scaleBy(x: -1.0, y: -1.0)

        bitmap.translateBy(x: -size.width / 2, y: -size.height / 2)
        bitmap.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image?
}

5

हो सकता है कि यह कुछ के लिए उपयोग किया जाएगा:

    UIImageOrientation imageOrientation;

    switch (sourceImage.imageOrientation) {
        case UIImageOrientationDown:
            imageOrientation = UIImageOrientationDownMirrored;
            break;

        case UIImageOrientationDownMirrored:
            imageOrientation = UIImageOrientationDown;
            break;

        case UIImageOrientationLeft:
            imageOrientation = UIImageOrientationLeftMirrored;
            break;

        case UIImageOrientationLeftMirrored:
            imageOrientation = UIImageOrientationLeft;

            break;

        case UIImageOrientationRight:
            imageOrientation = UIImageOrientationRightMirrored;

            break;

        case UIImageOrientationRightMirrored:
            imageOrientation = UIImageOrientationRight;

            break;

        case UIImageOrientationUp:
            imageOrientation = UIImageOrientationUpMirrored;
            break;

        case UIImageOrientationUpMirrored:
            imageOrientation = UIImageOrientationUp;
            break;
        default:
            break;
    }

    resultImage = [UIImage imageWithCGImage:sourceImage.CGImage scale:sourceImage.scale orientation:imageOrientation];

5

स्विफ्ट 3/4 के लिए:

imageView.transform = CGAffineTransform(scaleX: -1, y: 1)

यह एक UIImageView के लिए है, ओपी एक UIImage की तलाश कर रहा है
Shizam

2

एक साधारण विस्तार।

extension UIImage {

    var flipped: UIImage {
        guard let cgImage = cgImage else {
            return self
        }

        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }
}

उपयोग:

let image = #imageLiteral(resourceName: "imageName")
let imageView = UIImageView(image: image.flipped)

एक्सटेंशन स्विफ्ट की सबसे अच्छी विशेषताओं में से एक है। मैंने आश्चर्यचकित किया कि ऊपर दिए गए मूल उत्तर इसकी अनुशंसा करने में विफल रहे। मुझे यह संस्करण बहुत अच्छा लगा।
DS।

1

यह एक कार्यशील iOS8 / 9 संगत संस्करण है:

UIImage *image = [UIImage imageNamed:name];

if ([[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft) {

    if ([image respondsToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) {
        //iOS9
        image = image.imageFlippedForRightToLeftLayoutDirection;
    }
    else {
        //iOS8
        CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
        coreImage = [coreImage imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
        image = [UIImage imageWithCIImage:coreImage scale:image.scale orientation:UIImageOrientationUp];
    }
}

return image;

मुझे नहीं लगता कि यह सबसे अच्छा विचार है। इसका imageFlippedForRightToLeftLayoutDirection उपयोग फ़्लिप किए गए लेआउट निर्देशों के साथ किया जाना है - उदाहरण के लिए अरबी देशों के लिए। इसलिए इसका उपयोग करना हमेशा वांछित के रूप में काम नहीं कर सकता है।
पीटर स्टैगर

1
हां, आप सही हैं - मेरे मामले में यह आरटीएल समर्थन के लिए था। हम सभी जानते हैं कि SO पर कोड संदर्भ के लिए है और लोग वास्तव में इसे पहले समझे बिना ही कॉपी / पेस्ट नहीं करते हैं, है ना?
कैपिकॉ

1

स्विफ्ट 3 और इसके बाद के संस्करण में परीक्षण किया गया

एक्सटेंशन के साथ इस समस्या को प्राप्त करने का सरल उपाय यहां दिया गया है। मैं इसका परीक्षण करता हूं और यह काम करता है। आप किसी भी दिशा में दर्पण कर सकते हैं।

extension UIImage {

    func imageUpMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }

    func imageDownMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .downMirrored)
    }

    func imageLeftMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .leftMirrored)
    }

    func imageRightMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .rightMirrored)
    }
}

इस कोड के लिए उपयोग

let image = #imageLiteral(resourceName: "imageName")
flipHorizontally = image.imageUpMirror()

तो, आप अन्य कार्यों का उपयोग कर सकते हैं।


0

यहां ऊपर दिए गए उत्तरों में से एक है और स्विफ्ट 3 में मैं विशेष रूप से उपयोगी पाया गया जब आपके पास एक बटन है जिसे छवि को आगे और पीछे फ़्लिप करते रहने की आवश्यकता है।

func flipImage(sourceImage: UIImage,orientation: UIImageOrientation) -> UIImage {


        var imageOrientation = orientation

        switch sourceImage.imageOrientation {

        case UIImageOrientation.down:
            imageOrientation = UIImageOrientation.downMirrored;
            break;

        case UIImageOrientation.downMirrored:
            imageOrientation = UIImageOrientation.down;
            break;

        case UIImageOrientation.left:
            imageOrientation = UIImageOrientation.leftMirrored;
            break;

        case UIImageOrientation.leftMirrored:
            imageOrientation = UIImageOrientation.left;

            break;

        case UIImageOrientation.right:
            imageOrientation = UIImageOrientation.rightMirrored;

            break;

        case UIImageOrientation.rightMirrored:
            imageOrientation = UIImageOrientation.right;

            break;

        case UIImageOrientation.up:
            imageOrientation = UIImageOrientation.upMirrored;
            break;

        case UIImageOrientation.upMirrored:
            imageOrientation = UIImageOrientation.up;
            break;


        }


        return UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: imageOrientation)

    }

उपयोग:

imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)

0

SWIFT 3 में aroth का जवाब :

let sourceImage = UIImage(named: "whatever.png")!
let flippedImage = UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: .upMirrored)

0

स्विफ्ट 4

yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)

3
कोड-ओनली उत्तरों को आमतौर पर निम्न-गुणवत्ता माना जाता है। अपने कोड के अलावा, यह बताएं कि यह कैसे / क्यों काम करता है, समस्या को ठीक करता है, या प्रश्न का उत्तर देता है।
छरवे

1
इसके अलावा, यह ओपीएस प्रश्न के लिए काम नहीं करता है, क्योंकि वह छवि को फ्लिप करने के लिए कह रहा है। यहां कोड छवि दृश्य को फ़्लिप करता है। दोनों बहुत अलग हैं जहां उनका उपयोग किया जा सकता है। जैसे एक बटन एक छवि लेता है एक छवि दृश्य नहीं।
डी.एस.

इसके अलावा, आपने अभी-अभी मेरे उत्तर की नकल की और स्विफ्ट 4
शेकड सैग जूल

0

अलिखित करने के कारण निम्नलिखित हैं:

let srcImage = UIImage(named: "myimage")!
let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                   scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)

0

आप इस का उपयोग करते हुए छवि को घुमा सकते हैं

स्विफ्ट 4

extension UIImage {
public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
    let radiansToDegrees: (CGFloat) -> CGFloat = {
        return $0 * (180.0 / CGFloat(M_PI))
    }
    let degreesToRadians: (CGFloat) -> CGFloat = {
        return $0 / 180.0 * CGFloat(M_PI)
    }

    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint.zero, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()!

    bitmap.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)
    // Move the origin to the middle of the image so we will rotate and scale around the center.
    //CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0, rotatedSize.height / 2.0);

    //   // Rotate the image context
    bitmap.rotate(by: degreesToRadians(degrees))
   // CGContextRotateCTM(bitmap, degreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat

    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }
    bitmap.scaleBy(x: yFlip, y: -1.0)
    //CGContextScaleCTM(bitmap, yFlip, -1.0)
    bitmap.draw(self.cgImage!, in: CGRect.init(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
   // CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

}


0

स्विफ्ट 5 - Xcode 11.5

क्षैतिज रूप से घूमने का सबसे अच्छा समाधान: इस वीडियो को देखें:

https://m.youtube.com/watch?v=4kSLbuB-MlU

या इस कोड का उपयोग करें:

    
import UIKit
class FirstViewControl: UIViewController {
    @IBOutlet weak var buttonAnim: UIButton!

    @IBAction func ClickOnButtonAnim(_ sender: UIButton) {    
        UIView.transition(with: buttonAnim, duration: 0.4, options: .transitionFlipFromLeft, animation: nil , completion: nil)
    }

}

आप इस एनीमेशन में किसी भी ui (बटन या लेबल या uiview या छवि) का उपयोग कर सकते हैं।


1
उत्तर के रूप में लिंक पोस्ट करने की अनुशंसा नहीं की जाती है। लिंक किसी दिन अमान्य हो सकता है। यदि आपको लगता है कि विधि उपयोगी है, तो क्या आप इसे यहाँ पोस्ट कर सकते हैं?
क्रिस्टोफर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.