Edited at

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

More than 3 years have 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