iphone आईओएस पीएनजी छवि 90 डिग्री घूर्णन




objective-c ios (5)

यदि आपको मौजूदा छवि छवि imageOrientation प्रॉपर्टी के कारण परेशानी हो रही है, तो आप इस तरह के विभिन्न अभिविन्यास के साथ अन्यथा समान छवि बना सकते हैं:

CGImageRef imageRef = [sourceImage CGImage];

UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];

आपको अपनी प्रतिस्थापन छवियों पर सेट करने के लिए केवल उन्मुखीकरण के साथ प्रयोग करने की आवश्यकता हो सकती है, संभवतः आपके द्वारा शुरू किए गए अभिविन्यास के आधार पर स्विचिंग।

अपनी याददाश्त के उपयोग पर नजर रखें। फ़ोटोग्राफ़ी ऐप्स अक्सर बाहर निकलते हैं, और जब तक आप स्रोत छवि को रिलीज़ नहीं करते हैं, तब तक यह प्रति डिवाइस आपके संग्रहण को दोगुना कर देगा।

मेरे आईओएस एप्लिकेशन में मैं लिख रहा हूं, मैं पीएनजी से निपटता हूं क्योंकि मैं अल्फा चैनल से निपटता हूं। किसी कारण से, मैं अपनी imageView में एक पीएनजी लोड कर सकता imageView बस ठीक है, लेकिन जब यह मेरे आवेदन (छवि को पेस्टबोर्ड पर) से छवि की प्रतिलिपि बनाने या छवि को मेरे कैमरे रोल में सहेजने का समय आता है, तो छवि 90 डिग्री घूमती है।

मैंने इस पर हर जगह खोज की है, और मैंने जो कुछ सीखा है, वह यह है कि अगर मैंने जेपीईजी का इस्तेमाल किया, तो मुझे EXIF ​​जानकारी के कारण यह समस्या नहीं होगी (यह लगता है)।

मेरे ऐप में पूर्ण प्रतिलिपि / पेस्ट कार्यक्षमता है, और यहां किकर है (मैं इसे चरणों में लिखूंगा ताकि इसे पालन करना आसान हो):

  1. मेरे कैमरा रोल पर जाएं और एक छवि कॉपी करें
  2. मेरे ऐप में जाएं और "पेस्ट" दबाएं, छवि पेस्ट बस ठीक है, और मैं इसे पूरे दिन कर सकता हूं
  3. लागू किए गए प्रतिलिपि फ़ंक्शन पर क्लिक करें, और फिर "पेस्ट करें" पर क्लिक करें, और छवि चिपक जाती है लेकिन घुमाया जाता है।

मुझे 100% यकीन है कि मेरी प्रतिलिपि और पेस्ट कोड यहां गलत नहीं है, क्योंकि अगर मैं ऊपर चरण 2 पर वापस जाता हूं, और "सहेजें" पर क्लिक करता हूं, तो तस्वीर मेरी लाइब्रेरी में सहेजी जाती है लेकिन यह 90 डिग्री घुमाती है!

और भी अजीब बात यह है कि यह इंटरनेट से डाउनलोड की गई छवियों के साथ ठीक काम करता प्रतीत होता है, लेकिन मैन्युअल रूप से फोन के साथ ली गई छवियों के साथ बहुत हिट या मिस है। कुछ काम करता है, कुछ ऐसा नहीं करता है ...

क्या किसी के पास इस पर कोई विचार है? मैं किसी भी संभावित काम का उपयोग कर सकते हैं? मुझे कोड में बहुत भरोसा है कि यह मेरी छवियों में से लगभग 75% के लिए काम करता है। हालांकि मैं अनुरोध पर कोड पोस्ट कर सकता हूं।


इसे प्राप्त करने का एक और तरीका यहां दिया गया है:

@IBAction func rightRotateAction(sender: AnyObject) {

    let imgToRotate = CIImage(CGImage: sourceImageView.image?.CGImage)
    let transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
    let rotatedImage = imgToRotate.imageByApplyingTransform(transform)
    let extent = rotatedImage.extent()
    let contex = CIContext(options: [kCIContextUseSoftwareRenderer: false])
    let cgImage = contex.createCGImage(rotatedImage, fromRect: extent)
    adjustedImage = UIImage(CGImage: cgImage)!
    UIView.transitionWithView(sourceImageView, duration: 0.5, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: {
            self.sourceImageView.image = self.adjustedImage
        }, completion: nil)
}

कुछ दिनों लगे, लेकिन आखिरकार मैंने इसे उत्तर दिया @Dondragmer उत्तर के लिए धन्यवाद। लेकिन मुझे लगा कि मैं अपना पूरा समाधान पोस्ट करूंगा।

तो मूल रूप से मुझे समझदारी से मेरी छवियों को घुमाने के लिए एक विधि लिखनी पड़ी। नकारात्मकता यह है कि मुझे अपने कोड में हर जगह इस विधि को कॉल करना है और यह प्रोसेसर गहन है, खासकर मोबाइल उपकरणों पर काम करते समय, लेकिन प्लस साइड यह है कि मैं छवियां ले सकता हूं, छवियों की प्रतिलिपि बना सकता हूं, छवियों को पेस्ट कर सकता हूं और छवियों को सहेज सकता हूं और वे सभी ठीक से घूमते हैं। यहां कोड का उपयोग करके समाप्त किया गया है (विधि अभी तक 100% पूर्ण नहीं है, फिर भी मेमोरी लीक को संपादित करने की आवश्यकता है और क्या नहीं)।

मैंने सीख लिया कि पहली बार एक छवि मेरे आवेदन में डाली गई थी (चाहे वह "छवि लेना", "पेस्ट छवि" या "छवि का चयन करें" दबाकर उपयोगकर्ता के कारण हो, किसी कारण से यह ऑटो के बिना ठीक है घुमावदार। इस बिंदु पर, मैंने जो कुछ भी रोटेशन वैल्यू को ग्लोबल वैरिएबल में दिया था, जिसे imageOrientationWhenAddedToScreen कहा जाता है, जिसे imageOrientationWhenAddedToScreen कहा जाता है। इसने मेरी जिंदगी को आसान बना दिया क्योंकि जब यह छवि में हेरफेर करने और प्रोग्राम से छवि को सहेजने का समय आया, तो मैंने बस इस कैश किए गए ग्लोबल वैरिएबल को चेक किया और निर्धारित किया गया है कि मुझे छवि को सही तरीके से घुमाने की आवश्यकता है।

    - (UIImage*) rotateImageAppropriately:(UIImage*) imageToRotate {
    //This method will properly rotate our image, we need to make sure that
    //We call this method everywhere pretty much...

    CGImageRef imageRef = [imageToRotate CGImage];
    UIImage* properlyRotatedImage;

    if (imageOrientationWhenAddedToScreen == 0) {
       //Don't rotate the image
        properlyRotatedImage = imageToRotate;

    } else if (imageOrientationWhenAddedToScreen == 3) {

        //We need to rotate the image back to a 3
        properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:3];

    } else if (imageOrientationWhenAddedToScreen == 1) {

        //We need to rotate the image back to a 1
        properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];        

    }

    return properlyRotatedImage;

}

मुझे अभी भी 100% यकीन नहीं है कि ऐप्पल के पास यह अजीब छवि रोटेशन व्यवहार क्यों है (इसे आज़माएं ... अपना फोन लो और इसे उल्टा करें और एक तस्वीर लें, आप देखेंगे कि अंतिम तस्वीर सही तरफ निकलती है - शायद यह यही कारण है कि ऐप्पल इस प्रकार की कार्यक्षमता है?)।

मुझे पता है कि मैंने इसे समझने में बहुत समय बिताया है, इसलिए मुझे आशा है कि यह अन्य लोगों की मदद करेगी!


आप छवि के अभिविन्यास के संबंध में पीएनजी छवि को फ़ाइल (या NSMutableData ) में सहेजने के लिए छवि I / O का उपयोग कर सकते हैं। नीचे दिए गए उदाहरण में मैं path पर फ़ाइल में पीएनजी छवि को सहेजता हूं।

- (BOOL)savePngFile:(UIImage *)image toPath:(NSString *)path {
    NSData *data = UIImagePNGRepresentation(image);
    int exifOrientation = [UIImage cc_iOSOrientationToExifOrientation:image.imageOrientation];
    NSDictionary *metadata = @{(__bridge id)kCGImagePropertyOrientation:@(exifOrientation)};
    NSURL *url = [NSURL fileURLWithPath:path];
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    if (!source) {
        return NO;
    }
    CFStringRef UTI = CGImageSourceGetType(source);
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, UTI, 1, NULL);
    if (!destination) {
        CFRelease(source);
        return NO;
    }
    CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metadata);
    BOOL success = CGImageDestinationFinalize(destination);
    CFRelease(destination);
    CFRelease(source);
    return success;
}

cc_iOSOrientationToExifOrientation: UIImage श्रेणी का एक तरीका है।

+ (int)cc_iOSOrientationToExifOrientation:(UIImageOrientation)iOSOrientation {
    int exifOrientation = -1;
    switch (iOSOrientation) {
        case UIImageOrientationUp:
            exifOrientation = 1;
            break;

        case UIImageOrientationDown:
            exifOrientation = 3;
            break;

        case UIImageOrientationLeft:
            exifOrientation = 8;
            break;

        case UIImageOrientationRight:
            exifOrientation = 6;
            break;

        case UIImageOrientationUpMirrored:
            exifOrientation = 2;
            break;

        case UIImageOrientationDownMirrored:
            exifOrientation = 4;
            break;

        case UIImageOrientationLeftMirrored:
            exifOrientation = 5;
            break;

        case UIImageOrientationRightMirrored:
            exifOrientation = 7;
            break;

        default:
            exifOrientation = -1;
    }
    return exifOrientation;
}

आप CGImageDestinationCreateWithData का उपयोग करके छवि को NSData वैकल्पिक रूप से सहेज सकते हैं और CGImageDestinationCreateWithData में NSURL बजाय NSMutableData पास कर CGImageDestinationCreateWithURL


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

UIImage *image = ...;

//Have the image draw itself in the correct orientation if necessary
if(!(image.imageOrientation == UIImageOrientationUp ||
    image.imageOrientation == UIImageOrientationUpMirrored))
{
    CGSize imgsize = image.size;
    UIGraphicsBeginImageContext(imgsize);
    [image drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)];
    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

NSData *png = UIImagePNGRepresentation(image);




exif