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

More than 1 year has passed since last update.

画像バイナリデータ(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

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.