UIImage को NSData में बदलें और Swift में UIImage में वापस कनवर्ट करें?


142

मैं एक को बचाने के लिए कोशिश कर रहा हूँ UIImageकरने के लिए NSDataऔर फिर पढ़ा NSDataएक नया करने के लिए वापस UIImageस्विफ्ट में। निम्न कोड का उपयोग UIImageकरने के लिए NSDataमुझे परिवर्तित करने के लिए :

let imageData: NSData = UIImagePNGRepresentation(myImage)

मैं कैसे imageData(यानी, NSData) एक नए में परिवर्तित करूं UIImage?

जवाबों:


155

UIImage(data:imageData,scale:1.0) माना जाता है कि छवि का पैमाना 1 है।

स्विफ्ट 4.2 में, डेटा प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें ()।

image.pngData()

66

धन्यवाद। मेरी बहुत मदद की। स्विफ्ट 3 में परिवर्तित किया और काम किया

बचाना: let data = UIImagePNGRepresentation(image)

लोड करने के लिए: let image = UIImage(data: data)


1
let imagePt = UIImage(data: caminhodaImagem)पर्याप्त नहीं है?
superarts.org

32

imageWithData:विधि का उपयोग करें , जो कि स्विफ्ट के रूप में अनुवादित हो जाता हैUIImage(data:)

let image : UIImage = UIImage(data: imageData)

17

अब Swift 4.2 में आप इमेज से डेटा प्राप्त करने के लिए pngData()नई इंस्टेंस विधि का उपयोग कर सकते हैंUIImage

let profileImage = UIImage(named:"profile")!
let imageData = profileImage.pngData()

बीटा में स्विफ्ट 4.2 है? मैं इस कार्य को उपलब्ध नहीं देखता
डैनियल स्प्रिंगर

ऐसा लगता है कि इसका नाम बदल दिया गया है
吖 it 何魏奇 - Will आर्ची विल

'pngData ()' का नाम बदलकर 'UIImagePNGRepresentation (_ :)'
j2abro

9

विवरण

  • Xcode 10.2.1 (10E1001), स्विफ्ट 5

समाधान 1

guard let image = UIImage(named: "img") else { return }
let jpegData = image.jpegData(compressionQuality: 1.0)
let pngData = image.pngData()

समाधान 2.1

extension UIImage {
    func toData (options: NSDictionary, type: CFString) -> Data? {
        guard let cgImage = cgImage else { return nil }
        return autoreleasepool { () -> Data? in
            let data = NSMutableData()
            guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil }
            CGImageDestinationAddImage(imageDestination, cgImage, options)
            CGImageDestinationFinalize(imageDestination)
            return data as Data
        }
    }
}

समाधान का उपयोग 2.1

// about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage
let options: NSDictionary =     [
    kCGImagePropertyOrientation: 6,
    kCGImagePropertyHasAlpha: true,
    kCGImageDestinationLossyCompressionQuality: 0.5
]

// https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types
guard let data = image.toData(options: options, type: kUTTypeJPEG) else { return }
let size = CGFloat(data.count)/1000.0/1024.0
print("\(size) mb")

समाधान 2.2

extension UIImage {

    func toJpegData (compressionQuality: CGFloat, hasAlpha: Bool = true, orientation: Int = 6) -> Data? {
        guard cgImage != nil else { return nil }
        let options: NSDictionary =     [
                                            kCGImagePropertyOrientation: orientation,
                                            kCGImagePropertyHasAlpha: hasAlpha,
                                            kCGImageDestinationLossyCompressionQuality: compressionQuality
                                        ]
        return toData(options: options, type: .jpeg)
    }

    func toData (options: NSDictionary, type: ImageType) -> Data? {
        guard cgImage != nil else { return nil }
        return toData(options: options, type: type.value)
    }
    // about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage
    func toData (options: NSDictionary, type: CFString) -> Data? {
        guard let cgImage = cgImage else { return nil }
        return autoreleasepool { () -> Data? in
            let data = NSMutableData()
            guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil }
            CGImageDestinationAddImage(imageDestination, cgImage, options)
            CGImageDestinationFinalize(imageDestination)
            return data as Data
        }
    }

    // https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types
    enum ImageType {
        case image // abstract image data
        case jpeg                       // JPEG image
        case jpeg2000                   // JPEG-2000 image
        case tiff                       // TIFF image
        case pict                       // Quickdraw PICT format
        case gif                        // GIF image
        case png                        // PNG image
        case quickTimeImage             // QuickTime image format (OSType 'qtif')
        case appleICNS                  // Apple icon data
        case bmp                        // Windows bitmap
        case ico                        // Windows icon data
        case rawImage                   // base type for raw image data (.raw)
        case scalableVectorGraphics     // SVG image
        case livePhoto                  // Live Photo

        var value: CFString {
            switch self {
            case .image: return kUTTypeImage
            case .jpeg: return kUTTypeJPEG
            case .jpeg2000: return kUTTypeJPEG2000
            case .tiff: return kUTTypeTIFF
            case .pict: return kUTTypePICT
            case .gif: return kUTTypeGIF
            case .png: return kUTTypePNG
            case .quickTimeImage: return kUTTypeQuickTimeImage
            case .appleICNS: return kUTTypeAppleICNS
            case .bmp: return kUTTypeBMP
            case .ico: return kUTTypeICO
            case .rawImage: return kUTTypeRawImage
            case .scalableVectorGraphics: return kUTTypeScalableVectorGraphics
            case .livePhoto: return kUTTypeLivePhoto
            }
        }
    }
}

समाधान का उपयोग 2.2

let compressionQuality: CGFloat = 0.4
guard let data = image.toJpegData(compressionQuality: compressionQuality) else { return }
printSize(of: data)

let options: NSDictionary =     [
                                    kCGImagePropertyHasAlpha: true,
                                    kCGImageDestinationLossyCompressionQuality: compressionQuality
                                ]
guard let data2 = image.toData(options: options, type: .png) else { return }
printSize(of: data2)

समस्या

छवि का प्रतिनिधित्व करने वाले सीपीयू और मेमोरी संसाधनों का एक बहुत ले जाएगा। इसलिए, इस मामले में कई नियमों का पालन करना बेहतर है:

- मेन कतार पर jpegData (संपुटन गुण) :) न चलाएं

- केवल एक jpegData (सम्पीडन गुणक :) एक साथ चलाएँ

गलत:

for i in 0...50 {
    DispatchQueue.global(qos: .utility).async {
        let quality = 0.02 * CGFloat(i)
        //let data = image.toJpegData(compressionQuality: quality)
        let data = image.jpegData(compressionQuality: quality)
        let size = CGFloat(data!.count)/1000.0/1024.0
        print("\(i), quality: \(quality), \(size.rounded()) mb")
    }
}

सही:

let serialQueue = DispatchQueue(label: "queue", qos: .utility, attributes: [], autoreleaseFrequency: .workItem, target: nil)

for i in 0...50 {
    serialQueue.async {
        let quality = 0.02 * CGFloat(i)
        //let data = image.toJpegData(compressionQuality: quality)
        let data = image.jpegData(compressionQuality: quality)
        let size = CGFloat(data!.count)/1000.0/1024.0
        print("\(i), quality: \(quality), \(size.rounded()) mb")
    }
}

लिंक


वसीली, यह बेहद मददगार था। मैं आपके कोड का उपयोग करके UIImages को bmps में परिवर्तित करने में सक्षम हूं। मुझे bmp से अल्फ़ा निकालने की भी आवश्यकता है। मैंने अल्फा को हटाने के लिए विकल्प सेट करने की कोशिश की है और इसे परत से छुटकारा पाने के लिए प्रतीत नहीं कर सकता। मैं इस तरह से कॉल कर रहा हूँ: let options: NSDictionary = [kCGImagePropertyHasAlpha: false] let ConvertToBmp = image.toData (विकल्प: विकल्प, प्रकार: .bmp)
गैलेरी जूल 27'19

@ वाल्टर आपको यकीन है कि यह काम नहीं कर रहा है? अल्फा के साथ png छवि बनाने की कोशिश करें और इसे जांचें। हो सकता है कि bmp के साथ kCGImagePropertyHasAlpha गुण का उपयोग करना असंभव हो।
वसीली बोर्नार्चुक

@ vasily-bodnarchuk लीड के लिए धन्यवाद (और पहले कोड)। मुझे अल्फा से छुटकारा मिल गया - मैं इसे पीएनजी के माध्यम से नहीं कर सका, लेकिन मैंने अल्फा के साथ resizedImage.toJpegData का उपयोग किया, फिर इस डेटा को वापस UIImage में बदल दिया, फिर एक प्रकार का .Dmp किया। विकल्पों पर प्रभाव नहीं पड़ा, लेकिन इसने फ़ोटोशॉप में अल्फा परत को हटा दिया और एक छोटी फ़ाइल बनाई। फिर भी मैं सटीक 16 बिट रेखापुंज ग्राफिक bmp प्रारूप का उत्पादन नहीं कर सकता हूँ जो मुझे PyPortal की आवश्यकता है। जब मैं ऑनलाइन-कन्वर्ट जैसे टूल के माध्यम से परिवर्तित करता हूं, तो किसी कारण से संचित डेटा प्रदर्शित नहीं होता है। धन्यवाद।
गैलोजर

@ vasily-bodnarchuk, bmp जो मैंने आपके मददगार कोड का उपयोग करके सहेजा है, वह फ़ोटोशॉप w / bmp विकल्प "Flip row order" में खुलता है। यदि मैं "इस प्रकार सहेजें ..." के बाद प्रदर्शित होने वाले "बीएमपी विकल्प" स्क्रीन पर इस विकल्प को सहेजता और अनचेक करता हूं, तो PyPortal, अद्यतन bmp शो पर bmp लोड करें। मुझे कोई भी Apple डॉक्स नहीं दिखता है जो "Flip row order" विकल्प की तरह दिखता है, मैं अनिश्चित हूं कि यह डिफ़ॉल्ट सेव के रूप में क्यों दिखता है और मैं Swift में इसे "पूर्ववत करें" कैसे अनिश्चित हूं। BTW: मैंने अपनी Q & संबंधित फाइलें यहां पोस्ट की हैं: stackoverflow.com/questions/57241391/… धन्यवाद!
गैलोजर

8

डेटा के रूप में सहेजने के लिए:

StoryBoard से, यदि आप MainStoryBoard की छवि दृश्य पर "छवि" डेटा सहेजना चाहते हैं, तो निम्नलिखित कोड काम करेंगे।

let image = UIImagePNGRepresentation(imageView.image!) as NSData?

छवि पर "छवि" लोड करने के लिए: दृश्य विस्मयादिबोधक बिंदु "!", "?" बारीकी से कि क्या यह काफी एक जैसा है।

imageView.image = UIImage(data: image as! Data)

"NSData" प्रकार इस प्रक्रिया के दौरान स्वचालित रूप से "डेटा" प्रकार में परिवर्तित हो जाता है।


6

कोड के सुरक्षित निष्पादन के लिए, ऐप क्रैश को रोकने के लिए if-letब्लॉक का उपयोग करें Dataऔर, क्योंकि फ़ंक्शन UIImagePNGRepresentationएक वैकल्पिक मान लौटाता है।

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

नोट: डेटा स्विफ्ट 3+ वर्ग है। NSData के बजाय Swift 3+ के साथ डेटा का उपयोग करें

सामान्य छवि संचालन (जैसे png और jpg दोनों):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

एक्सटेंशन का उपयोग करके:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(self)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

4

डेटा के लिए छवि: -

    if let img = UIImage(named: "xxx.png") {
        let pngdata = img.pngData()
    }

   if let img = UIImage(named: "xxx.jpeg") {
        let jpegdata = img.jpegData(compressionQuality: 1)
    }

छवि के लिए डेटा: -

 let image = UIImage(data: pngData)

1

स्विफ्ट 5

UIImage के रूप में आपके द्वारा बनाई गई छवि को छवि होने दें

image.pngData() as NSData? 

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