ইউএসআইজেটকে এনএসডিটাতে রূপান্তর করুন এবং সুইফটে ইউআইআইমেজে ফিরে যেতে চান?


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

এখন সুইফ্ট ৪.২ এ আপনি চিত্র থেকে ডেটা পাওয়ার জন্য pngData()নতুন উদাহরণ পদ্ধতিটি ব্যবহার করতে পারেনUIImage

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

সুইট কি বিটাতে 4.2? আমি এই ফাংশনটি উপলভ্য দেখছি না
ড্যানিয়েল স্প্রিংগার

দেখে মনে হচ্ছে এটির নামকরণ হয়েছে
吖 奇 说 - y আর্কি উইল তিনি

'পিএনজিডাটা ()' এর নাম পরিবর্তন করে 'ইউআইআইজিএজপিএনজি রিপ্রেজিশনেশন (_ :)' করা হয়েছে
জে 2abro

9

বিস্তারিত

  • এক্সকোড 10.2.1 (10E1001), সুইফট 5

সমাধান ঘ

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

সমাধানের ব্যবহার ২.১

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

সমাধানের ব্যবহার ২.২

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 (কম্প্রেশনকুয়ালিটি :) চালাবেন না

- একসাথে কেবল একটি জেপিগডাটা (সংক্ষেপণকৌলিকতা) চালান

ভুল:

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")
    }
}

লিংক


ভ্যাসিলি, এটি অত্যন্ত সহায়ক ছিল। আমি আপনার কোড ব্যবহার করে ইউআইআইএমজেসগুলিকে বিএমপিতে রূপান্তর করতে সক্ষম able আমারও বিএমপি থেকে আলফা সরানো দরকার। আমি আলফা সরানোর জন্য বিকল্পগুলি সেট করার চেষ্টা করেছি এবং স্তরটি থেকে মুক্তি পেতে পারে বলে মনে হচ্ছে না। আমি এটির মতো কল করছি: আসুন বিকল্পগুলি: এনএসডি অভিধান = [কেসিজিমেজপ্রোপার্টিহাসআল্ফা: মিথ্যা] আসুন রূপান্তর করুন তোবম্প = চিত্র.toData (বিকল্পগুলি: বিকল্পগুলি, টাইপ: .bmp)
গ্যালাওগ্রার

@ গ্যালাউ’র আপনি কি নিশ্চিত যে এটি কাজ করছে না? Png চিত্রটি আলফা দিয়ে তৈরি করার চেষ্টা করুন এবং এটি পরীক্ষা করুন। বিসিপি সহ কেসিজিমেজপ্রোপার্টিহাসআল্ফা সম্পত্তি ব্যবহার করা অসম্ভব হতে পারে।
ভ্যাসিলি বোদনারুকুক

@ ভ্যাসিলি-বোদনারুকুক সীসা (এবং আগের কোড) এর জন্য ধন্যবাদ। আমি আলফা থেকে মুক্তি পেয়েছি - আমি পিএনজি এর মাধ্যমে এটি করতে পারিনি, তবে আমি আলফাকে পুনরায় আকারযুক্ত ইমেজ.টোজেপডাটাটি মিথ্যা হিসাবে ব্যবহার করেছি, তারপরে এই ডেটাটিকে আবার একটি ইউআইআইমেজে রূপান্তরিত করেছি, তারপরে .bmp টাইপের একটি ডেটা করেছি। বিকল্পগুলির কোনও প্রভাব ছিল না, তবে এটি ফটোশপে আলফা স্তরটিকে সরিয়ে একটি ছোট ফাইল তৈরি করেছে। পাইপোর্টালের জন্য আমার প্রয়োজনীয় 16-বিট রাস্টার গ্রাফিক বিএমপি ফর্ম্যাটটি এখনও তৈরি করতে পারে না। কিছু কারণের জন্য যখন আমি অনলাইন-কনভার্টের মতো সরঞ্জামের মাধ্যমে রূপান্তর করি তখন কনভেভড ডেটা প্রদর্শিত হয় না। ধন্যবাদ.
গ্যালাওগার

@ ভ্যাসিলি-বোদনারুকুক, আপনার সহায়ক কোডটি ব্যবহার করে আমি যে বিএমপি সংরক্ষণ করেছি সেগুলি ফটোশপ ডাব্লু / বিএমপি বিকল্পটিতে "ফ্লিপ সারি অর্ডার" খোলে। যদি আমি "বিএমপি বিকল্পগুলি" স্ক্রিনে "বিকল্পটি সেভ করুন ..." এর পরে উপস্থিত এই বিকল্পটি পুনরায় পুনঃনির্ধারণ ও আনচেক করেন, তবে পাইপোর্টাল, আপডেট হওয়া বিএমপি শোতে bmp লোড করুন। আমি কোনও অ্যাপল ডক্স দেখতে পাচ্ছি না যা "ফ্লিপ সারি অর্ডার" বিকল্পের মতো দেখায়, আমি নিশ্চিত নই যে এটি কেন ডিফল্ট সংরক্ষণ হিসাবে প্রদর্শিত হবে এবং আমি সুইফটে কীভাবে "পূর্বাবস্থাপন করব" সে বিষয়ে নিশ্চিত নই। বিটিডাব্লু: আমি আমার প্রশ্নোত্তর ও সম্পর্কিত ফাইলগুলি এখানে পোস্ট করেছি: stackoverflow.com/questions/57241391/… ধন্যবাদ!
গ্যালাওগ্রার

8

ডেটা হিসাবে সংরক্ষণ করতে:

স্টোরিবোর্ড থেকে, যদি আপনি মেইনস্টিরিবোর্ডের চিত্রভিউতে "চিত্র" ডেটা সংরক্ষণ করতে চান তবে নীচের কোডগুলি কাজ করবে।

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

"চিত্র" ছবিতে লোড করতে ভিউ: বিস্ময়কর বিন্দুটি দেখুন "!", "?" কাছাকাছি কিনা যে এটি এক হিসাবে একই।

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

এই প্রক্রিয়া চলাকালীন "এনএসডিটা" প্রকারটি স্বয়ংক্রিয়ভাবে "ডেটা" টাইপে রূপান্তরিত হয়।


6

কোডের নিরাপদ প্রয়োগের জন্য, অ্যাপ্লিকেশন ক্রাশ রোধ করতে if-letব্লক ব্যবহার Dataকরুন & যেমন ফাংশনটি UIImagePNGRepresentationএকটি returnsচ্ছিক মান দেয়।

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

দ্রষ্টব্য: ডেটা হ'ল সুইফ্ট 3+ শ্রেণি। সুইফট 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

আপনি যে চিত্রটি ইউআইআইমেজ হিসাবে তৈরি করেছেন তা চিত্র হতে দিন

image.pngData() as NSData? 

দয়া করে মাধ্যমে পড়া করার জন্য একটু সময় সম্পাদনা সাহায্যের মধ্যে সহায়তা কেন্দ্র । স্ট্যাক ওভারফ্লোতে ফর্ম্যাট করা অন্যান্য সাইটের চেয়ে আলাদা।
ধর্মন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.