UIImageをNSDataに変換し、SwiftでUIImageに戻す?


142

私はtoを保存してUIImageから、Swiftの新しいものにNSData読みNSData戻そうとしていますUIImage。に変換UIImageするNSDataには、次のコードを使用しています。

let imageData: NSData = UIImagePNGRepresentation(myImage)

どのようにして変換しないimageData(すなわち、NSData新に)戻ってUIImage

回答:


155

UIImage(data:imageData,scale:1.0) 画像のスケールが1であると仮定します。

Swift 4.2では、get Data()に以下のコードを使用します。

image.pngData()

66

ありがとう。私を大いに助けてくれました。Swift 3に変換して動作しました

保存する: let data = UIImagePNGRepresentation(image)

ロードするには: let image = UIImage(data: data)


1
let imagePt = UIImage(data: caminhodaImagem)十分ではありませんか?
superarts.org 2017


17

今でスウィフト4.2を使用できpngData()の新しいインスタンスメソッドをUIImageイメージからデータを取得します

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

Swift 4.2はベータ版ですか?この機能が利用可能
Daniel Springer

名前が変更されたようです
吖奇说-何魏奇Archy Will He

「pngData()」は「UIImagePNGRepresentation(_ :)」に名前が変更されました
j2abro

9

細部

  • Xcode 10.2.1(10E1001)、Swift 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)

問題

表す画像は、多くのCPUとメモリリソースを必要とします。したがって、この場合はいくつかのルールに従うことをお勧めします。

-メインキューでjpegData(compressionQuality :)を実行しない

-同時に1つのjpegData(compressionQuality :)のみを実行します

違う:

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(options:options、type:.bmp)
Gallaugher

@Gallaugherそれが機能していないことを確信していますか?アルファなしのpng画像を作成して確認します。bmpでkCGImagePropertyHasAlphaプロパティを使用することが不可能である可能性があります。
Vasily Bodnarchuk

@ vasily-bodnarchukリード(および以前のコード)をありがとう。アルファを取り除きました-pngではできませんでしたが、alphaをfalseにしてresizedImage.toJpegDataを使用し、このデータをUIImageに変換し直してから、.bmpタイプのtoDataを行いました。オプションによる影響はありませんでしたが、Photoshopのアルファレイヤーが削除され、より小さなファイルが作成されました。それでも、PyPortalに必要な正確な16ビットラスターグラフィックbmp形式を生成できません。何らかの理由で、オンライン変換などのツールを使用して変換すると、不必要なデータが表示されません。どうも。
Gallaugher

@ vasily-bodnarchuk、役立つコードを使用して保存したbmpをPhotoshopで開き、bmpオプションの[行の順序を反転]を選択します。[名前を付けて保存]の後に表示される[BMPオプション]画面でこのオプションを再保存してチェックを外すと、PyPortalにbmpが読み込まれ、更新されたbmpが表示されます。「Flip row order」オプションのようなAppleのドキュメントは表示されません。これがデフォルトの保存として表示される理由がわからないので、Swiftでこれを「元に戻す」方法がわかりません。ところで、私はQ&関連ファイルをstackoverflow.com/questions/57241391/…に投稿しました。ありがとう!
Gallaugher

8

データとして保存するには:

StoryBoardから、「画像」データをMainStoryBoardのimageViewに保存する場合、次のコードが機能します。

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

「image」をimageViewにロードするには:感嘆符「!」、「?」を見てください。それがこれとまったく同じかどうかを密接に。

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

「NSData」タイプは、このプロセス中に「Data」タイプに自動的に変換されます。


6

コードを安全に実行するには、関数でオプションの値が返されるため、if-letblock with Dataを使用してアプリのクラッシュとを防止しUIImagePNGRepresentationます。

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

注:データはSwift 3以上のクラスです。Swift 3以降でNSDataの代わりにDataを使用する

一般的な画像操作(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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.