2015-02-12 9 views
6

में कनवर्ट करते समय छवि अभिविन्यास खोना आयताकार मूल छवि से छवि के वर्ग भाग को क्रॉप करते समय मुझे छवि अभिविन्यास समस्या का सामना करना पड़ रहा है। जब छवि परिदृश्य में होती है, तो यह ठीक है। लेकिन जब यह चित्र में है, ऐसा लगता है कि छवि उन्मुखीकरण संरक्षित नहीं है, जो गलत अभिविन्यास और बुरा फसल के साथ एक छवि में परिणाम:किसी छवि को CGImage

func cropImage(cropRectangleCoordinates: CGRect) { 

     let croppedImage = originalImage 

     let finalCroppedImage : CGImageRef = CGImageCreateWithImageInRect(croppedImage.CGImage, cropRectangleCoordinates) 

     finalImage = UIImage(CGImage: finalCroppedImage)! 


    } 

मुझे लगता है कि समस्या croppedImage.CGImage के साथ है। यहां छवि CGImage में परिवर्तित हो जाती है, लेकिन ऐसा लगता है कि अभिविन्यास को संरक्षित नहीं किया जाता है। केवल UIImage का उपयोग करके अभिविन्यास को संरक्षित करना आसान है, लेकिन फसल बनाने के लिए, छवि को अस्थायी रूप से CGImage होना चाहिए और यह समस्या है। यहां तक ​​कि यदि मैं UIImage पर कनवर्ट करते समय छवि को पुन: पेश करता हूं, तो यह सही अभिविन्यास में हो सकता है लेकिन CGImage को क्रॉप करते समय क्षति पहले ही हो चुकी है।

यह एक त्वरित सवाल है, इसलिए कृपया तेजी से जवाब दें, क्योंकि समाधान उद्देश्य-सी में अलग हो सकता है। छवि के मूल अभिविन्यास (और बड़े पैमाने) बनाए रखने के लिए

finalImage = UIImage(CGImage:finalCroppedImage, scale:originalImage.scale, orientation:originalImage.orientation) 

:

उत्तर

5

मुझे एक समाधान मिला .... समय बताएगा कि यह पर्याप्त मजबूत है, लेकिन ऐसा लगता है कि यह सभी परिस्थितियों में काम करता है। यह ठीक करने के लिए एक दुष्कर्म था।

तो समस्या यह है कि यूआईएममेज, कुछ मामलों में, केवल CGImage में परिवर्तित होने पर इसका अभिविन्यास खो देता है। यह पोर्ट्रेट छवि को प्रभावित करता है, जो स्वचालित रूप से लैंडस्केप मोड में डाल दिया जाता है। तो डिफ़ॉल्ट रूप से परिदृश्य हैं जो छवि प्रभावित नहीं हैं। लेकिन जहां बग दुर्भावनापूर्ण है यह है कि यह सभी चित्र छवियों को प्रभावित नहीं करता है !! इसके अलावा imageorientation मान कुछ छवि के लिए मदद नहीं करेगा। वे समस्याग्रस्त छवियां वे छवियां हैं जिनके उपयोगकर्ता की लाइब्रेरी में है कि उन्हें ईमेल, संदेश या वेब से सहेजा गया है, इसलिए कैमरे से नहीं लिया गया है। इन छवियों में संभवतः अभिविन्यास जानकारी नहीं है, और इस प्रकार कुछ मामलों में, चित्र में एक छवि .... CGImage में परिवर्तित होने पर चित्र में रहता है। मैं वास्तव में तब तक अटक गया जब तक मुझे एहसास हुआ कि मेरी डिवाइस लाइब्रेरी में मेरी कुछ छवि संदेशों या ईमेल से सहेजी गई थी।

तो मुझे लगता है कि कौन सी छवि को पुन: केंद्रित किया जाएगा, यह एकमात्र विश्वसनीय तरीका है, किसी दिए गए छवि के दोनों संस्करण: UIImage, और CGImage, और उनके ऊंचाई मूल्य की तुलना करना है। यदि वे बराबर हैं, तो CGImage संस्करण घुमाया नहीं जाएगा और आप इसके साथ काम कर सकते हैं। लेकिन यदि वे ऊंचाई अलग हैं, तो आप सुनिश्चित कर सकते हैं कि CGImageCreateWithImageInRect से CGImage रूपांतरण छवि को लैंडस्केप करेगा। इस मामले में, मैं मूल के x/y समन्वय को स्वैप करता हूं, कि मैं फसल के आयताकार समन्वय के रूप में पास करता हूं और यह उन विशेष छवियों को सही तरीके से मानता है।

यह एक लंबी पोस्ट थी, लेकिन मुख्य विचार CGImage ऊंचाई की तुलना UIImage चौड़ाई से करना है, और यदि वे अलग हैं, तो मूल बिंदु को उलटा होने की उम्मीद है।

+2

लेकिन अगर छवि को स्क्वायर किया गया था तो यह आपके समाधान के लिए एक बड़ी समस्या होगी: [] – Husam

+0

बस एक दृश्य पथ डालें और छवि को अपलोड करें UIImageView * imgViewTemp = [[UIImageView alloc] init]; [imgViewTemp setImage: [UIImage imageWithCGImage: [rep fullScreenImage]]]; UIImage * संपीड़ित छवि = [mYGlobal funResizing: imgViewTemp.image]; मुझे एक ही समस्या है लेकिन ऊपर की तरह ठीक है। – chetu

3

करने के लिए अपने UIImage निर्माण कॉल बदलें।

+0

प्राप्त किया जा सकता है, लेकिन समस्या यह अधिक शातिर है: finalimage पहले से ही फसल हो चुकी है, अभिविन्यास का नुकसान पहले चरण में होता है: फसल Image.CGImage। आप जो सुझाव देते हैं वह छवि को सही ढंग से घुमा सकता है लेकिन क्षति के बाद किया जाता है। –

+0

बहुत बहुत धन्यवाद। वह मेरी मदद करता है। –

4

यहां एक यूआईएममेज एक्सटेंशन है जिसे मैंने दूसरों द्वारा लिखे गए कोड के कई पुराने टुकड़ों को देखने के बाद लिखा था। यह स्विफ्ट 3 में लिखा गया है और उचित अभिविन्यास में छवि को फिर से खींचने के लिए आईओएस ओरिएंटेशन प्रॉपर्टी प्लस CGAffineTransform का उपयोग करता है।

स्विफ्ट 3:

public extension UIImage { 

    /// Extension to fix orientation of an UIImage without EXIF 
    func fixOrientation() -> UIImage { 

     guard let cgImage = cgImage else { return self } 

     if imageOrientation == .up { return self } 

     var transform = CGAffineTransform.identity 

     switch imageOrientation { 

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

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

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

     case .up, .upMirrored: 
      break 
     } 

     switch imageOrientation { 

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

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

     case .up, .down, .left, .right: 
      break 
     } 

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

      ctx.concatenate(transform) 

      switch imageOrientation { 

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

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

      if let finalImage = ctx.makeImage() { 
       return (UIImage(cgImage: finalImage)) 
      } 
     } 

     // something failed -- return original 
     return self 
    } 
} 
+0

कॉल करने के लिए कनवर्ट करने से पहले इसे कॉल करना image.cg छवि ने – Cjay

8

स्विफ्ट 3:

परिवर्तित इस विधि द्वारा UIImage को cgImage घुमाया

UIImage(cgImage:croppedCGImage, scale:originalImage.scale, orientation:originalImage.imageOrientation) 

स्रोत @ दाऊद बेरी का जवाब

+0

काम किया है :) यह अन्य उत्तरों में मैंने देखा है रोटेशन कोड की 100 लाइनों की तुलना में यह बहुत बेहतर है: डी –

0

यह जवाब है, @awolf को क्रेडिट (Cropping an UIImage)। पूरी तरह से पैमाने और अभिविन्यास संभालती है। बस उस विधि को उस छवि पर कॉल करें जिसे आप फसल करना चाहते हैं, और स्केलिंग CGRect में स्केल या अभिविन्यास के बारे में चिंता किए बिना क्रॉप करें। यह जांचने के लिए स्वतंत्र महसूस करें कि cgImage बल की बजाय शून्य है, जैसा कि मैंने यहां किया था।

extension UIImage { 
    func croppedInRect(rect: CGRect) -> UIImage { 
     func rad(_ degree: Double) -> CGFloat { 
      return CGFloat(degree/180.0 * .pi) 
     } 

     var rectTransform: CGAffineTransform 
     switch imageOrientation { 
     case .left: 
      rectTransform = CGAffineTransform(rotationAngle: rad(90)).translatedBy(x: 0, y: -self.size.height) 
     case .right: 
      rectTransform = CGAffineTransform(rotationAngle: rad(-90)).translatedBy(x: -self.size.width, y: 0) 
     case .down: 
      rectTransform = CGAffineTransform(rotationAngle: rad(-180)).translatedBy(x: -self.size.width, y: -self.size.height) 
     default: 
      rectTransform = .identity 
     } 
     rectTransform = rectTransform.scaledBy(x: self.scale, y: self.scale) 

     let imageRef = self.cgImage!.cropping(to: rect.applying(rectTransform)) 
     let result = UIImage(cgImage: imageRef!, scale: self.scale, orientation: self.imageOrientation) 
     return result 
    } 
} 

एक और ध्यान दें: यदि आप imageView एक scrollView में एम्बेडेड के साथ काम कर रहे हैं, वहाँ एक अतिरिक्त कदम है, तो आप खाते में ज़ूम कारक लेना है। मान लिया जाये कि अपने imageViewscrollView की संपूर्ण सामग्री को देखने तक फैला है, और आप फसल फ्रेम के रूप में scrollView की सीमा का उपयोग करें, फसली छवि मुझे लगता है कि कोशिश की के रूप में

let ratio = imageView.image!.size.height/scrollView.contentSize.height 
let origin = CGPoint(x: scrollView.contentOffset.x * ratio, y: scrollView.contentOffset.y * ratio) 
let size = CGSize(width: scrollView.bounds.size.width * ratio, let height: scrollView.bounds.size.height * ratio) 
let cropFrame = CGRect(origin: origin, size: size) 
let croppedImage = imageView.image!.croppedInRect(rect: cropFrame) 
संबंधित मुद्दे