iOS - UIImageView - UIImage छवि अभिविन्यास कैसे संभालना है


80

क्या UIImageViewछवि अभिविन्यास को संभालने के लिए सेटअप करना संभव है ? जब मैंने UIImageViewछवि को ओरिएंटेशन राइट के साथ सेट किया (यह कैमरा रोल से फोटो है), छवि को दाईं ओर घुमाया गया है, लेकिन मैं इसे उचित अभिविन्यास में दिखाना चाहता हूं, क्योंकि यह लिया गया था।

मुझे पता है कि मैं छवि डेटा को घुमा सकता हूं लेकिन यह अधिक सुरुचिपूर्ण करना संभव है?

जवाबों:


142

अगर मैं समझता हूं, तो आप क्या करना चाहते हैं, यह UIImage के अभिविन्यास की अवहेलना है? यदि ऐसा है तो आप ऐसा कर सकते हैं:

UIImage *originalImage = [... whatever ...];

UIImage *imageToDisplay =
     [UIImage imageWithCGImage:[originalImage CGImage]
              scale:[originalImage scale]
              orientation: UIImageOrientationUp];

तो आप मूल (के रूप में अपनी CGImage संपत्ति के माध्यम से संदर्भित) के समान पिक्सेल डेटा के साथ एक नया UIImage बना रहे हैं, लेकिन आप एक अभिविन्यास निर्दिष्ट कर रहे हैं जो डेटा को घुमाता नहीं है।


4
वैसे, मैं वास्तव में छवि डेटा को कैसे घुमा सकता हूं?
वांग लियांग

7
मुझे लगता है कि आप बना सकते हैं एक उपयुक्त आकार CGContextके साथ CGBitmapContextCreate(या साथ UIGraphicsBeginImageContextआशुलिपि), उपयोग CGContextRotateCTMया तो एक रोटेशन, उपयोग निर्धारित करने के लिए drawInRect:पर UIImageया CGContextDrawImageछवि के साथ CGImage, संपत्ति तो साथ या तो एक छवि के लिए संदर्भ परिवर्तित UIGraphicsGetImageFromCurrentImageContext(और है, तो UIGraphicsEndImageContextअगर आप) संदर्भ बनाने के लिए UIKit का उपयोग किया, या CGBitmapContextCreateImageयदि आप कोर ग्राफिक्स के साथ चिपके हुए थे। UIKit बहुत थ्रेड सुरक्षित नहीं है, लेकिन कोड निटर होगा।
टॉमी

जब मैं छवि को ImageView में रखता हूं तो मुझे यह काम करने के लिए नहीं मिल सकता है ... यह छवि को मूल अभिविन्यास के साथ प्रदर्शित करता है, भले ही मैं छवि को प्रतिबिंब के साथ बना रहा हूं: [UIImage imageWithCGImage: image.CGImage पैमाने: छवि .scale अभिविन्यास: UIImageOrientationUpMirrored] ... ओपी ने एक ImageView का उपयोग करने के बारे में पूछा, लेकिन मुझे यह समाधान ImageView में काम करने के लिए नहीं मिल सकता है ...
Ethan G

1
पीएनजी के लिए काम करता है, हालांकि, HEIC के लिए नहीं।
डॉनसॉन्ग

50

आप पूरी तरह से रूपांतरित करने और खुद को स्केल करने से बच सकते हैं, जैसा कि इस उत्तर में a0 द्वारा सुझाया गया है :

- (UIImage *)normalizedImage {
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale);
    [self drawInRect:(CGRect){0, 0, self.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
}

UIImage तरीकों के लिए दस्तावेज़ आकार और drawInRect स्पष्ट रूप से कहा है कि वे खाते उन्मुखीकरण में रखते हैं।


1
यह एक जीवन रक्षक है।
क्वार्क

मैं इसे कहाँ चिपकाऊँ?
फ्रॉस्टमॉर्न

25

मैंने यहाँ Anomie के उत्तर में कोड को बदल दिया है (ऊपर suvish valsan द्वारा कॉपी-पेस्ट किया गया) Swift में :

func fixOrientation() -> UIImage {
    if self.imageOrientation == UIImageOrientation.Up {
        return self
    }

    var transform = CGAffineTransformIdentity

    switch self.imageOrientation {
    case .Down, .DownMirrored:
        transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI));

    case .Left, .LeftMirrored:
        transform = CGAffineTransformTranslate(transform, self.size.width, 0);
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2));

    case .Right, .RightMirrored:
        transform = CGAffineTransformTranslate(transform, 0, self.size.height);
        transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2));

    case .Up, .UpMirrored:
        break
    }

    switch self.imageOrientation {

    case .UpMirrored, .DownMirrored:
        transform = CGAffineTransformTranslate(transform, self.size.width, 0)
        transform = CGAffineTransformScale(transform, -1, 1)

    case .LeftMirrored, .RightMirrored:
        transform = CGAffineTransformTranslate(transform, self.size.height, 0)
        transform = CGAffineTransformScale(transform, -1, 1);

    default:
        break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    let ctx = CGBitmapContextCreate(
        nil,
        Int(self.size.width),
        Int(self.size.height),
        CGImageGetBitsPerComponent(self.CGImage),
        0,
        CGImageGetColorSpace(self.CGImage),
        UInt32(CGImageGetBitmapInfo(self.CGImage).rawValue)
    )

    CGContextConcatCTM(ctx, transform);

    switch self.imageOrientation {
    case .Left, .LeftMirrored, .Right, .RightMirrored:
        // Grr...
        CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.height,self.size.width), self.CGImage);

    default:
        CGContextDrawImage(ctx, CGRectMake(0, 0, self.size.width,self.size.height), self.CGImage);
        break;
    }

    // And now we just create a new UIImage from the drawing context
    let cgimg = CGBitmapContextCreateImage(ctx)

    let img = UIImage(CGImage: cgimg!)

    return img;
}

(मैं पैरामीटर के सभी occurencies प्रतिस्थापित imageके साथ self, क्योंकि मेरे कोड पर एक विस्तार है UIImage)।


संपादित करें: स्विफ्ट 3 संस्करण।

विधि एक वैकल्पिक लौटाती है, क्योंकि कई मध्यवर्ती कॉल विफल हो सकती हैं और मुझे उपयोग करना पसंद नहीं है !

func fixOrientation() -> UIImage? {

    guard let cgImage = self.cgImage else {
        return nil
    }

    if self.imageOrientation == UIImageOrientation.up {
        return self
    }

    let width  = self.size.width
    let height = self.size.height

    var transform = CGAffineTransform.identity

    switch self.imageOrientation {
    case .down, .downMirrored:
        transform = transform.translatedBy(x: width, y: height)
        transform = transform.rotated(by: CGFloat.pi)

    case .left, .leftMirrored:
        transform = transform.translatedBy(x: width, y: 0)
        transform = transform.rotated(by: 0.5*CGFloat.pi)

    case .right, .rightMirrored:
        transform = transform.translatedBy(x: 0, y: height)
        transform = transform.rotated(by: -0.5*CGFloat.pi)

    case .up, .upMirrored:
        break
    }

    switch self.imageOrientation {
    case .upMirrored, .downMirrored:
        transform = transform.translatedBy(x: width, y: 0)
        transform = transform.scaledBy(x: -1, y: 1)

    case .leftMirrored, .rightMirrored:
        transform = transform.translatedBy(x: height, y: 0)
        transform = transform.scaledBy(x: -1, y: 1)

    default:
        break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    guard let colorSpace = cgImage.colorSpace else {
        return nil
    }

    guard let context = CGContext(
        data: nil,
        width: Int(width),
        height: Int(height),
        bitsPerComponent: cgImage.bitsPerComponent,
        bytesPerRow: 0,
        space: colorSpace,
        bitmapInfo: UInt32(cgImage.bitmapInfo.rawValue)
        ) else {
            return nil
    }

    context.concatenate(transform);

    switch self.imageOrientation {

    case .left, .leftMirrored, .right, .rightMirrored:
        // Grr...
        context.draw(cgImage, in: CGRect(x: 0, y: 0, width: height, height: width))

    default:
        context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
    }

    // And now we just create a new UIImage from the drawing context
    guard let newCGImg = context.makeImage() else {
        return nil
    }

    let img = UIImage(cgImage: newCGImg)

    return img;
}

(नोट: Xcode 8.1 के तहत स्विफ्ट 3 संस्करण ऑड्स संकलित करता है, लेकिन वास्तव में यह काम नहीं करता है। इसमें कहीं एक टाइपो हो सकता है, मिश्रित चौड़ाई / ऊंचाई, आदि किसी भी त्रुटि को इंगित / ठीक करने के लिए स्वतंत्र महसूस हो सकता है)।


मैंने स्विफ्ट में कनवर्ट करने के बाद उपरोक्त कोड का उपयोग किया है। यदि किसी को स्विफ्ट 3 संस्करण की आवश्यकता हो तो नीचे दिए गए मेरे उत्तर को
चेक करें

छवि अभिविन्यास बिल्कुल नहीं बदला। क्षमा करें, मैं iOS के विकास में नया हूं। मैंने क्या किया, मैं फ़ंक्शन को UIImage एक्सटेंशन में उपयोग करता हूं, फिर इसे प्रोग्रामेटिक रूप से अंदर सेट करें func viewDidLoad। यह चित्र samsung फोन photos.google.com/share/… से है और इसमें 270 CW अभिविन्यास एक्सिफ़ डेटा है। यहां मैं इसका उपयोग कैसे करता हूंlet background: UIImage? = UIImage(named: "background_image")?.fixOrientation() backgroundImage.image = background
HendraWD

किसी को भी इस @Nicolas का उपयोग कर मेमोरी लीक मुद्दे मिल रहे हैं? ऐसा लगता है कि CGImages को नहीं हटाया जा रहा है। मेरा ऐप एक मास फोटो मैनेजमेंट ऐप है और कई तस्वीरों से संबंधित है। यह फ़ंक्शन हर बार चलने पर मेमोरी को लीक करता प्रतीत होता है। क्या इसके लिए कोई त्वरित सुधार हैं?
माइकल रीली

@MichaelReilly हम्म, इसे विस्तार से नहीं देखा, लेकिन कोरग्राफिक्स कॉल को एआरसी के साथ तेजी से काम करना चाहिए।
निकोलस मियारी

@MichaelReilly मुझे यह उत्तर मिला, जो मेरे अवलोकन को पुष्ट करता प्रतीत होता है: stackoverflow.com/a/25790214/433373
निकोलस मारी

24

यह विधि पहले UIImage के वर्तमान अभिविन्यास की जाँच करती है और फिर यह एक दक्षिणावर्त तरीके से अभिविन्यास को बदल देती है और UIImage को वापस करती है। आप इस चित्र को इस रूप में दिखा सकते हैं

self.imageView.image = रोटमेज (currentUIImage)

   func rotateImage(image:UIImage)->UIImage
    {
        var rotatedImage = UIImage();
        switch image.imageOrientation
        {
            case UIImageOrientation.Right:
            rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Down);

           case UIImageOrientation.Down:
            rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Left);

            case UIImageOrientation.Left:
            rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Up);

             default:
            rotatedImage = UIImage(CGImage:image.CGImage!, scale: 1, orientation:UIImageOrientation.Right);
        }
        return rotatedImage;
    }

स्विफ्ट 4 संस्करण

func rotateImage(image:UIImage) -> UIImage
    {
        var rotatedImage = UIImage()
        switch image.imageOrientation
        {
        case .right:
            rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .down)

        case .down:
            rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .left)

        case .left:
            rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .up)

        default:
            rotatedImage = UIImage(cgImage: image.cgImage!, scale: 1.0, orientation: .right)
        }

        return rotatedImage
    }

हाय वरिंदर, और एसओ पर मदद करने के लिए धन्यवाद। क्या आप थोड़ा सोच सकते हैं कि आपको कैसे लगता है कि यह मार्टिन की मदद कर सकता है? कैसे और अधिक सुरुचिपूर्ण घूर्णन डेटा की तुलना में अपने समाधान है?
जे। चोमेल

1. हम UIImageView से वर्तमान UIImage लेंगे। 2. हम इस पद्धति को (रोटोमेज) कहेंगे और इस वर्तमान UIImage को एक तर्क के रूप में पास करेंगे 3. UIImageView.image / में दिए गए मान को संग्रहीत करते हुए / यह छवि दृश्य के भीतर डेटा को घुमाएगा: ) :)
वेंडर सिंह

मेरे अनुसार सर यह सबसे अच्छा उत्तर है क्योंकि अगर हम पूरे UIImageView को घुमाएंगे तो UIImageView X एक नकारात्मक मान होगा। लेकिन अगर हम डेटा को घुमाते हैं तो UIImageView जगह पर रहेगा और केवल डेटा घुमाया जाएगा। यदि आप एक वर्ग UIImageView लेते हैं तो आप बस CGAffineTransformateakeRotate का उपयोग करके पूरे UIImageView को बदल सकते हैं।
वरिंदर सिंह

यह स्वीकृत उत्तर होना चाहिए! एक आकर्षण की तरह काम किया :)
Ely Dantas 16

स्विफ्ट 3 में: rotatedImage = UIImage (cgImage: image.cgImage !, स्केल: 1, ओरिएंटेशन: UIImageOrientation.right)
अंसल एंटनी

19

स्विफ्ट 3.1

func fixImageOrientation(_ image: UIImage)->UIImage {
    UIGraphicsBeginImageContext(image.size)
    image.draw(at: .zero)
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage ?? image
}

यह एक सही समाधान है :)
miff

आप सभी बिट्स मेरे मित्र हैं
मिशेल गैंट

यह इससे बेहतर है । यह स्विफ्ट 4 में काम करता है, लेकिन ऐसा नहीं है।
अचलोइलू

धन्यवाद। यह काम करता है अगर आपको अपनी छवि को सर्वर पर अपलोड करने की आवश्यकता है, न केवल अधिकांश अन्य उत्तरों के रूप में प्रदर्शित करें।
घुमक्कड़ डेवलपर

बहुत अच्छा काम करता है। किसी भी छवि को लेता है और इसे 19up पर .up अभिविन्यास
zumzum

9

स्विफ्ट में UIImage का विस्तार। तुम सब करने की ज़रूरत नहीं है कि सभी flipping, वास्तव में। उद्देश्य-सी मूल यहाँ है , लेकिन मैंने बिट को जोड़ा है जो मूल छवि के अल्फा का सम्मान करता है (गंभीर रूप से, लेकिन यह पारदर्शी छवियों से अपारदर्शी छवियों को अलग करने के लिए काम करता है)।

// from https://github.com/mbcharbonneau/UIImage-Categories/blob/master/UIImage%2BAlpha.m
// Returns true if the image has an alpha layer
    private func hasAlpha() -> Bool {
        guard let cg = self.cgImage else { return false }
        let alpha = cg.alphaInfo
        let retVal = (alpha == .first || alpha == .last || alpha == .premultipliedFirst || alpha == .premultipliedLast)
        return retVal
    }

    func normalizedImage() -> UIImage? {
        if self.imageOrientation == .up {
            return self
        }
        UIGraphicsBeginImageContextWithOptions(self.size, !self.hasAlpha(), self.scale)
        var rect = CGRect.zero
        rect.size = self.size
        self.draw(in: rect)
        let retVal = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return retVal
    }

8

छवि उन्मुखीकरण पर विचार करते हुए यहां एक व्यावहारिक नमूना कोड दिया गया है:

#define rad(angle) ((angle) / 180.0 * M_PI)
- (CGAffineTransform)orientationTransformedRectOfImage:(UIImage *)img
{
    CGAffineTransform rectTransform;
    switch (img.imageOrientation)
    {
        case UIImageOrientationLeft:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -img.size.height);
            break;
        case UIImageOrientationRight:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -img.size.width, 0);
            break;
        case UIImageOrientationDown:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -img.size.width, -img.size.height);
            break;
        default:
            rectTransform = CGAffineTransformIdentity;
    };

    return CGAffineTransformScale(rectTransform, img.scale, img.scale);
}


- (UIImage *)croppedImage:(UIImage*)orignialImage InRect:(CGRect)visibleRect{
    //transform visible rect to image orientation
    CGAffineTransform rectTransform = [self orientationTransformedRectOfImage:orignialImage];
    visibleRect = CGRectApplyAffineTransform(visibleRect, rectTransform);

    //crop image
    CGImageRef imageRef = CGImageCreateWithImageInRect([orignialImage CGImage], visibleRect);
    UIImage *result = [UIImage imageWithCGImage:imageRef scale:orignialImage.scale orientation:orignialImage.imageOrientation];
    CGImageRelease(imageRef);
    return result;
}

8

मैंने स्विफ्ट 3 के कोड को @ स्विफ्ट 3 से कोड में तब परिवर्तित किया जब किसी को इसकी आवश्यकता थी

func fixOrientation() -> UIImage
{

    if self.imageOrientation == UIImageOrientation.up {
        return self
    }

    var transform = CGAffineTransform.identity

    switch self.imageOrientation {
    case .down, .downMirrored:
        transform = transform.translatedBy(x: self.size.width, y: self.size.height)
        transform = transform.rotated(by: CGFloat(M_PI));

    case .left, .leftMirrored:
        transform = transform.translatedBy(x: self.size.width, y: 0);
        transform = transform.rotated(by: CGFloat(M_PI_2));

    case .right, .rightMirrored:
        transform = transform.translatedBy(x: 0, y: self.size.height);
        transform = transform.rotated(by: CGFloat(-M_PI_2));

    case .up, .upMirrored:
        break
    }


    switch self.imageOrientation {

    case .upMirrored, .downMirrored:
        transform = transform.translatedBy(x: self.size.width, y: 0)
        transform = transform.scaledBy(x: -1, y: 1)

    case .leftMirrored, .rightMirrored:
        transform = transform.translatedBy(x: self.size.height, y: 0)
        transform = transform.scaledBy(x: -1, y: 1);

    default:
        break;
    }

    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    let ctx = CGContext(
        data: nil,
        width: Int(self.size.width),
        height: Int(self.size.height),
        bitsPerComponent: self.cgImage!.bitsPerComponent,
        bytesPerRow: 0,
        space: self.cgImage!.colorSpace!,
        bitmapInfo: UInt32(self.cgImage!.bitmapInfo.rawValue)
    )



    ctx!.concatenate(transform);

    switch self.imageOrientation {

    case .left, .leftMirrored, .right, .rightMirrored:
        // Grr...
        ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.height ,height:self.size.width))

    default:
        ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.width ,height:self.size.height))
        break;
    }

    // And now we just create a new UIImage from the drawing context
    let cgimg = ctx!.makeImage()

    let img = UIImage(cgImage: cgimg!)

    return img;

}

प्रतिनिधि विधियों में imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any] let imageCaptured:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage छवि को कैप्चर करने के बाद छवि हमेशा सही होती है और यह विधि वापस आ रही है छवि :(
सुमीत मोर्या

हाँ छवि अभिविन्यास बिल्कुल ठीक है। लेकिन यह UIImageView पर सही ढंग से प्रदर्शित होता है। Apple के पास कुछ आंतरिक डेटा हैं जिनका उपयोग यहाँ पर सही
ढंग

4

अपने स्विफ्ट 3 अनुवाद के लिए Waseem05 के लिए धन्यवाद, लेकिन उसकी विधि केवल मेरे लिए काम करती है जब मैंने इसे UIImage के विस्तार के अंदर लपेट दिया और इसे मूल वर्ग के बाहर / नीचे रखा जैसे:

extension UIImage {

        func fixOrientation() -> UIImage
        {

            if self.imageOrientation == UIImageOrientation.up {
            return self
        }

        var transform = CGAffineTransform.identity

        switch self.imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: self.size.width, y: self.size.height)
            transform = transform.rotated(by: CGFloat(M_PI));

        case .left, .leftMirrored:
            transform = transform.translatedBy(x: self.size.width, y: 0);
            transform = transform.rotated(by: CGFloat(M_PI_2));

        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: self.size.height);
            transform = transform.rotated(by: CGFloat(-M_PI_2));

        case .up, .upMirrored:
            break
        }


        switch self.imageOrientation {

        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)

        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: self.size.height, y: 0)
            transform = transform.scaledBy(x: -1, y: 1);

        default:
            break;
        }

        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx = CGContext(
            data: nil,
            width: Int(self.size.width),
            height: Int(self.size.height),
            bitsPerComponent: self.cgImage!.bitsPerComponent,
            bytesPerRow: 0,
            space: self.cgImage!.colorSpace!,
            bitmapInfo: UInt32(self.cgImage!.bitmapInfo.rawValue)
        )



        ctx!.concatenate(transform);

        switch self.imageOrientation {

        case .left, .leftMirrored, .right, .rightMirrored:
            // Grr...
            ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.height ,height:self.size.width))

        default:
            ctx?.draw(self.cgImage!, in: CGRect(x:0 ,y: 0 ,width: self.size.width ,height:self.size.height))
            break;
        }

        // And now we just create a new UIImage from the drawing context
        let cgimg = ctx!.makeImage()

        let img = UIImage(cgImage: cgimg!)

        return img;

    }
}

फिर इसके साथ बुलाया:

let correctedImage:UIImage = wonkyImage.fixOrientation()

और तब सब ठीक था! जब हमें फ्रंट / बैक कैमरा और अप / डाउन / लेफ्ट / राइट डिवाइस ओरिएंटेशन मेटाडेटा की आवश्यकता नहीं है, तो Apple को ओरिएंटेशन को छोड़ना आसान बनाना चाहिए।


4

यदि आपको छवि को घुमाने और ठीक करने की आवश्यकता है, तो विस्तार के नीचे उन्मुखीकरण उपयोगी होगा।

extension UIImage {

    public func imageRotatedByDegrees(degrees: CGFloat) -> UIImage {
        //Calculate the size of the rotated view's containing box for our drawing space
        let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi / 180)
        rotatedViewBox.transform = t
        let rotatedSize: CGSize = rotatedViewBox.frame.size
        //Create the bitmap context
        UIGraphicsBeginImageContext(rotatedSize)
        let bitmap: CGContext = UIGraphicsGetCurrentContext()!
        //Move the origin to the middle of the image so we will rotate and scale around the center.
        bitmap.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2)
        //Rotate the image context
        bitmap.rotate(by: (degrees * CGFloat.pi / 180))
        //Now, draw the rotated/scaled image into the context
        bitmap.scaleBy(x: 1.0, y: -1.0)
        bitmap.draw(self.cgImage!, in: CGRect(x: -self.size.width / 2, y: -self.size.height / 2, width: self.size.width, height: self.size.height))
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }


    public func fixedOrientation() -> UIImage {
        if imageOrientation == UIImageOrientation.up {
            return self
        }

        var transform: CGAffineTransform = CGAffineTransform.identity

        switch imageOrientation {
        case UIImageOrientation.down, UIImageOrientation.downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height)
            transform = transform.rotated(by: CGFloat.pi)
            break
        case UIImageOrientation.left, UIImageOrientation.leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.rotated(by: CGFloat.pi/2)
            break
        case UIImageOrientation.right, UIImageOrientation.rightMirrored:
            transform = transform.translatedBy(x: 0, y: size.height)
            transform = transform.rotated(by: -CGFloat.pi/2)
            break
        case UIImageOrientation.up, UIImageOrientation.upMirrored:
            break
        }

        switch imageOrientation {
        case UIImageOrientation.upMirrored, UIImageOrientation.downMirrored:
            transform.translatedBy(x: size.width, y: 0)
            transform.scaledBy(x: -1, y: 1)
            break
        case UIImageOrientation.leftMirrored, UIImageOrientation.rightMirrored:
            transform.translatedBy(x: size.height, y: 0)
            transform.scaledBy(x: -1, y: 1)
        case UIImageOrientation.up, UIImageOrientation.down, UIImageOrientation.left, UIImageOrientation.right:
            break
        }

        let ctx: CGContext = CGContext(data: nil,
                                       width: Int(size.width),
                                       height: Int(size.height),
                                       bitsPerComponent: self.cgImage!.bitsPerComponent,
                                       bytesPerRow: 0,
                                       space: self.cgImage!.colorSpace!,
                                       bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!

        ctx.concatenate(transform)

        switch imageOrientation {
        case UIImageOrientation.left, UIImageOrientation.leftMirrored, UIImageOrientation.right, UIImageOrientation.rightMirrored:
            ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
        default:
            ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
            break
        }

        let cgImage: CGImage = ctx.makeImage()!

        return UIImage(cgImage: cgImage)
    }
}

2
extension UIImage {
    func fixImageOrientation() -> UIImage {
        UIGraphicsBeginImageContext(self.size)
        self.draw(at: .zero)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage ?? self
    }
}
  1. शीर्ष उदाहरण की तरह विस्तार बनाएँ।
  2. इसे बुलाओ: imageView.image?.fixImageOrientation()याUIImage(named: "someImage").fixImageOrientation()

  3. अच्छा भाग्य सभी के लिए!


यह ठीक काम करता है। लेकिन मेमोरी कुछ भी बन रही है और अगर यह लूप में है तो ऐप क्रैश हो रहा है।
अभिमुर्लीधरन

@abhimuralidharan, मैंने इसे लूप में चेक नहीं किया, लेकिन 100% लागू करने का एक तरीका है।
मिहेल सालारी


0

@Aqua उत्तर से प्रेरित .....

ऑब्जेक्टिव सी में

- (UIImage *)fixImageOrientation:(UIImage *)img {

   UIGraphicsBeginImageContext(img.size);
   [img drawAtPoint:CGPointZero];

   UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   if (newImg) {
       return newImg;
   }

   return img;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.