UIImage NSData dönüştürmek ve Swift UIImage dönüştürmek?


143

Ben kurtarmaya çalışıyorum UIImageiçin NSDatave sonra okunan NSDatabir yeniye arkasını UIImageSwift. Dönüştürmek için UIImageiçin NSDataaşağıdaki kodu kullanıyorum:

let imageData: NSData = UIImagePNGRepresentation(myImage)

Nasıl yeniye dönüştürebilirim imageData(yani NSData) UIImage?

Yanıtlar:


156

UIImage(data:imageData,scale:1.0) Görüntünün ölçeğini varsayarsak 1.

Hızlı 4.2'de, Get Data () için aşağıdaki kodu kullanın.

image.pngData()

67

Teşekkürler. Bana çok yardım etti. Swift 3'e dönüştürüldü ve çalıştı

Kaydetmek: let data = UIImagePNGRepresentation(image)

Yüklemek için: let image = UIImage(data: data)


1
Değil mi let imagePt = UIImage(data: caminhodaImagem)yeterli?
superarts.org


17

Artık Swift 4.2'de verileri görüntüden almak için pngData()yeni örnek yöntemini kullanabilirsiniz.UIImage

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

Swift 4.2 Beta sürümünde mi? Ben bu işlevi mevcut görmüyorum
Daniel Springer

yeniden adlandırılmış gibi görünüyor
吖 奇 说 - 何魏奇 Archy Will He

'pngData ()', 'UIImagePNGRepresentation (_ :)' olarak yeniden adlandırıldı
j2abro

9

ayrıntılar

  • Xcode 10.2.1 (10E1001), Swift 5

Çözüm 1

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

Çözüm 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
        }
    }
}

Çözelti kullanımı 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")

Çözüm 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
            }
        }
    }
}

Çözelti kullanımı 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)

sorunlar

Temsili görüntü çok fazla işlemci ve bellek kaynağı alacaktır. Bu nedenle, bu durumda birkaç kurala uymak daha iyidir:

- ana kuyrukta jpegData (sıkıştırmaKalitesi :) çalıştırmayın

- aynı anda yalnızca bir jpegData (sıkıştırmaKalitesi :) çalıştır

Yanlış:

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

Sağ:

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

Bağlantılar


Vasily, bu son derece yararlı oldu. Kodunuzu kullanarak UIImages'ı bmp'ye dönüştürebiliyorum. Ayrıca bmp alfa kaldırmak gerekir. Alfa kaldırmak için seçenekler ayarlamak için çalıştım & katman kurtulmak için almak gibi görünmüyor. Ben şu şekilde arıyorum: let options: NSDictionary = [kCGImagePropertyHasAlpha: false] let convertToBmp = image.toData (seçenekler: seçenekler, tür: .bmp)
Gallaugher

@Gallaugher'ın çalışmadığından emin misiniz? Alfa olmadan png resmi oluşturmaya ve kontrol etmeye çalışın. Belki bmp ile kCGImagePropertyHasAlpha özelliğini kullanmak mümkün değildir.
Vasily Bodnarchuk

@ vasily-bodnarchuk Lead (ve önceki kod) için teşekkürler. Alfadan kurtuldum - png ile yapamadım, ancak alfa ile false olarak resizedImage.toJpegData kullandım, sonra bu verileri tekrar bir UIImage'e dönüştürdüm, sonra .bmp türünde bir toData yaptım. Seçeneklerin bir etkisi olmadı, ancak bu Photoshop'ta alfa katmanını kaldırdı ve daha küçük bir dosya oluşturdu. Hala bir PyPortal için gereken tam 16 bit raster grafik bmp formatını üretemiyorum. Bazı nedenlerden dolayı, çevrimiçi dönüştürme gibi bir araçla dönüştürdüğümde, konveli veriler göstermiyor. Teşekkürler.
Gallaugher

@ vasily-bodnarchuk, yararlı kodunuzu kullanarak kaydettiğim bmp Photoshop'ta "Satır sırasını çevir" seçeneği ile açılır. "Farklı kaydet ..." ifadesinden sonra görünen "BMP Seçenekleri" ekranında bu seçeneği yeniden kaydeder ve işaretini kaldırırsam, PyPortal, güncellenmiş bmp şovlarına bmp yükleyin. "Satır sırasını çevir" seçeneğine benzeyen herhangi bir Apple dokümanı görmüyorum, bunun neden varsayılan kaydetme olarak göründüğünden emin değilim ve Swift'te bunu nasıl geri alacağımdan emin değilim. BTW: Q ve ilgili dosyalarımı şurada yayınladım: stackoverflow.com/questions/57241391/… Teşekkürler!
Gallaugher

8

Veri olarak kaydetmek için:

StoryBoard'dan, "image" verilerini MainStoryBoard'ın imageView dosyasına kaydetmek isterseniz, aşağıdaki kodlar çalışır.

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

İmageView dizinine "image" yüklemek için: "!", "?" bununla aynı olup olmadığına yakından bakalım.

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

"NSData" türü, bu işlem sırasında otomatik olarak "Veri" türüne dönüştürülür.


6

Kodun güvenli bir şekilde yürütülmesi için, işlev isteğe bağlı bir değer döndürdüğü için , uygulama kilitlenmesini önlemek için if-letbloğu kullanın .DataUIImagePNGRepresentation

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

Not: Veriler Swift 3+ sınıfıdır. Swift 3+ ile NSData yerine Veri kullanma

Genel görüntü işlemleri (png ve jpg gibi):

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

Uzantıyı kullanarak:

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

Resimden Veriye: -

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

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

Resme Veri: -

 let image = UIImage(data: pngData)

1

Hızlı 5

UIImage olarak oluşturduğunuz görüntünün görüntü olmasına izin verin

image.pngData() as NSData? 

Aracılığıyla okumak için bir dakikanızı ayırın düzenleme yardım içinde yardım merkezindeki . Yığın Taşması üzerinde biçimlendirme diğer sitelerden farklıdır.
Dharman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.