[Swift]画像形式をNSDataと拡張子から判別する

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

画像バイナリデータ(NSData)から画像形式を判別

//NSDataを拡張
extension NSData {
    func imageTypeForImageData() -> String? {
        var c = [UInt32](count: 1, repeatedValue: 0)
        self.getBytes(&c, length: 1)
        switch (c[0]) {
        case 0xFF:
            return "jpeg"
        case 0x89:
            return "png"
        case 0x47:
            return "gif"
        case 0x42:
            return "bmp"
        default:
            return nil
        }
    }
}

画像ファイル名の拡張子から画像形式を判別

//NSURLを拡張
extension NSURL {
    func imageTypeForExtention() -> String? {
        let ext = self.pathExtension!.lowercaseString
        switch ext {
        case ".jpg" , ".jpeg":
            return "jpeg"
        case ".png":
            return "png"
        case ".gif":
            return "gif"
        case ".bmp":
            return "bmp"
        default:
            return nil
        }
    }   
}

例:Alamofireでmimetypeを指定して画像アップロードする

// imageData:NSData?
// fileUrl:NSURL?
// image:UIImage
Alamofire.upload(
    .POST,
    "https://httpbin.org/post",
    multipartFormData: { multipartFormData in
      if let imageType = imageData?.imageTypeForImageData() {
          //バイナリから画像形式の判別
          multipartFormData.appendBodyPart(data: imageData!, name: "file", fileName: "IMG."+imageType, mimeType: "image/"+imageType)
      } else if let imageType = fileUrl?.imageTypeForExtention() {
          //拡張子から画像形式の判別
          multipartFormData.appendBodyPart(data: imageData!, name: "file", fileName: "IMG."+imageType, mimeType: "image/"+imageType)
      } else {
          // 判別できないものはJPEG形式の画像フォーマットとしてNSDataに変換
          let data:NSData = UIImageJPEGRepresentation(image , 1.0)!
          multipartFormData.appendBodyPart(data: data, name: "file", fileName: "IMG.jpg", mimeType: "image/jpeg")
      }
    },
    encodingCompletion: { encodingResult in
        switch encodingResult {
        case .Success(let upload, _, _):
            upload.responseJSON { response in
                debugPrint(response)
            }
        case .Failure(let encodingError):
            print(encodingError)
        }
    }
)

参考

Finding image type from NSData or UIImage
Path extension and MIME type of file in swift
Alamofire