如何从 swift 中的 UIImage 获取图像 extension/format?
How to get Image extension/format from UIImage in swift?
我正在尝试将图片上传到我的服务器,但在上传之前,我需要检查它是否是有效格式。
假设我只想要 .jpeg
和 .png
,所以如果用户从他们的 phone 中选择 .gif
格式的图像,我会显示一些警告。
我从用户那里得到图片gallery/camera,然后我想查看格式,但我不知道如何查看格式
@IBAction func selectPictureButtonDidPressed(_ sender: Any) {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.allowsEditing = true
let actionSheet = UIAlertController(title: "Photo Source", message: "please choose your source", preferredStyle: .actionSheet)
// action camera
let actionCamera = UIAlertAction(title: "Camera", style: .default) { (action) in
if UIImagePickerController.isSourceTypeAvailable(.camera) {
imagePickerController.sourceType = .camera
self.present(imagePickerController, animated: true, completion: nil)
} else {
self.showAlert(alertTitle: "Opppss", alertMessage: "camera can't be used / not available", actionTitle: "OK")
print("camera can't be used / not available")
}
}
// action photo library
let actionPhotoLibrary = UIAlertAction(title: "Photo Library", style: .default) { (action) in
imagePickerController.sourceType = .photoLibrary
self.present(imagePickerController, animated: true, completion: nil)
}
//action cancel
let actionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
actionSheet.addAction(actionCamera)
actionSheet.addAction(actionPhotoLibrary)
actionSheet.addAction(actionCancel)
self.present(actionSheet, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
postImage.image = image
picker.dismiss(animated: true, completion: nil)
doesItHasImage = true
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
如何检查该格式?
我试图在 google 上找到,但如果它是从 URL 派生的,我只能得到图像格式。不是像这样直接来自 UIImage
import UIKit
import ImageIO
struct ImageHeaderData{
static var PNG: [UInt8] = [0x89]
static var JPEG: [UInt8] = [0xFF]
static var GIF: [UInt8] = [0x47]
static var TIFF_01: [UInt8] = [0x49]
static var TIFF_02: [UInt8] = [0x4D]
}
enum ImageFormat{
case Unknown, PNG, JPEG, GIF, TIFF
}
extension NSData{
var imageFormat: ImageFormat{
var buffer = [UInt8](repeating: 0, count: 1)
self.getBytes(&buffer, range: NSRange(location: 0,length: 1))
if buffer == ImageHeaderData.PNG
{
return .PNG
} else if buffer == ImageHeaderData.JPEG
{
return .JPEG
} else if buffer == ImageHeaderData.GIF
{
return .GIF
} else if buffer == ImageHeaderData.TIFF_01 || buffer == ImageHeaderData.TIFF_02{
return .TIFF
} else{
return .Unknown
}
}
}
// USAGE
let imageURLFromParse = NSURL(string : "https://i.stack.imgur.com/R64uj.jpg")
let imageData = NSData(contentsOf: imageURLFromParse! as URL)
print(imageData!.imageFormat)
您需要将图像覆盖为原始数据,可能使用 UIImagePNGRepresentation()
或 UIImageJPEGRepresentation()
,然后将其发送到您的服务器。该数据将分别采用 PNG
或 JPEG
格式。
你可以试试这个:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
let assetPath = info[UIImagePickerControllerReferenceURL] as! NSURL
if (assetPath.absoluteString?.hasSuffix("JPG"))! {
print("JPG")
}
else if (assetPath.absoluteString?.hasSuffix("PNG"))! {
print("PNG")
}
else if (assetPath.absoluteString?.hasSuffix("GIF"))! {
print("GIF")
}
else {
print("Unknown")
}
}
如果首选使用 URL,在 swift 5.2 中您可以使用
enum ImageFormat {
case png
case jpeg
case gif
case tiff
case unknown
init(byte: UInt8) {
switch byte {
case 0x89:
self = .png
case 0xFF:
self = .jpeg
case 0x47:
self = .gif
case 0x49, 0x4D:
self = .tiff
default:
self = .unknown
}
}
}
extension Data {
var imageFormat: ImageFormat{
guard let header = map({ [=10=] as UInt8 })[safe: 0] else {
return .unknown
}
return ImageFormat(byte: header)
}
}
extension Collection {
/// Returns the element at the specified index iff it is within bounds, otherwise nil.
/// - Parameters:
/// - Parameter index: The index of the item to get safely the element
/// - Returns: The element if available or nil otherwise
subscript(safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
我发现:
jpegData(compressionQuality: CGFloat)
pngData()
总是成功,而且内存效率不高。在一个案例中,我看到一张 1.6Mb 的图像变成了 6MB 只是因为 pngData()
更新代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[.editedImage] as? UIImage else { return }
if let assetPath = info[.imageURL] as? URL{
let URLString = assetPath.absoluteString.lowercased()
if (URLString.hasSuffix("jpg")) {
print("JPG")
uploadedImage = image
uploadImage(type: ImageTypes.JPG)
}
else if (URLString.hasSuffix("jpeg")) {
print("JPEG")
}
else if (URLString.hasSuffix("png")) {
print("PNG")
}
else {
print("Invalid Type")
}
}
dismiss(animated: true)
}
我正在尝试将图片上传到我的服务器,但在上传之前,我需要检查它是否是有效格式。
假设我只想要 .jpeg
和 .png
,所以如果用户从他们的 phone 中选择 .gif
格式的图像,我会显示一些警告。
我从用户那里得到图片gallery/camera,然后我想查看格式,但我不知道如何查看格式
@IBAction func selectPictureButtonDidPressed(_ sender: Any) {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.allowsEditing = true
let actionSheet = UIAlertController(title: "Photo Source", message: "please choose your source", preferredStyle: .actionSheet)
// action camera
let actionCamera = UIAlertAction(title: "Camera", style: .default) { (action) in
if UIImagePickerController.isSourceTypeAvailable(.camera) {
imagePickerController.sourceType = .camera
self.present(imagePickerController, animated: true, completion: nil)
} else {
self.showAlert(alertTitle: "Opppss", alertMessage: "camera can't be used / not available", actionTitle: "OK")
print("camera can't be used / not available")
}
}
// action photo library
let actionPhotoLibrary = UIAlertAction(title: "Photo Library", style: .default) { (action) in
imagePickerController.sourceType = .photoLibrary
self.present(imagePickerController, animated: true, completion: nil)
}
//action cancel
let actionCancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
actionSheet.addAction(actionCamera)
actionSheet.addAction(actionPhotoLibrary)
actionSheet.addAction(actionCancel)
self.present(actionSheet, animated: true, completion: nil)
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let image = info[UIImagePickerControllerOriginalImage] as! UIImage
postImage.image = image
picker.dismiss(animated: true, completion: nil)
doesItHasImage = true
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
如何检查该格式?
我试图在 google 上找到,但如果它是从 URL 派生的,我只能得到图像格式。不是像这样直接来自 UIImage
import UIKit
import ImageIO
struct ImageHeaderData{
static var PNG: [UInt8] = [0x89]
static var JPEG: [UInt8] = [0xFF]
static var GIF: [UInt8] = [0x47]
static var TIFF_01: [UInt8] = [0x49]
static var TIFF_02: [UInt8] = [0x4D]
}
enum ImageFormat{
case Unknown, PNG, JPEG, GIF, TIFF
}
extension NSData{
var imageFormat: ImageFormat{
var buffer = [UInt8](repeating: 0, count: 1)
self.getBytes(&buffer, range: NSRange(location: 0,length: 1))
if buffer == ImageHeaderData.PNG
{
return .PNG
} else if buffer == ImageHeaderData.JPEG
{
return .JPEG
} else if buffer == ImageHeaderData.GIF
{
return .GIF
} else if buffer == ImageHeaderData.TIFF_01 || buffer == ImageHeaderData.TIFF_02{
return .TIFF
} else{
return .Unknown
}
}
}
// USAGE
let imageURLFromParse = NSURL(string : "https://i.stack.imgur.com/R64uj.jpg")
let imageData = NSData(contentsOf: imageURLFromParse! as URL)
print(imageData!.imageFormat)
您需要将图像覆盖为原始数据,可能使用 UIImagePNGRepresentation()
或 UIImageJPEGRepresentation()
,然后将其发送到您的服务器。该数据将分别采用 PNG
或 JPEG
格式。
你可以试试这个:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
let assetPath = info[UIImagePickerControllerReferenceURL] as! NSURL
if (assetPath.absoluteString?.hasSuffix("JPG"))! {
print("JPG")
}
else if (assetPath.absoluteString?.hasSuffix("PNG"))! {
print("PNG")
}
else if (assetPath.absoluteString?.hasSuffix("GIF"))! {
print("GIF")
}
else {
print("Unknown")
}
}
如果首选使用 URL,在 swift 5.2 中您可以使用
enum ImageFormat {
case png
case jpeg
case gif
case tiff
case unknown
init(byte: UInt8) {
switch byte {
case 0x89:
self = .png
case 0xFF:
self = .jpeg
case 0x47:
self = .gif
case 0x49, 0x4D:
self = .tiff
default:
self = .unknown
}
}
}
extension Data {
var imageFormat: ImageFormat{
guard let header = map({ [=10=] as UInt8 })[safe: 0] else {
return .unknown
}
return ImageFormat(byte: header)
}
}
extension Collection {
/// Returns the element at the specified index iff it is within bounds, otherwise nil.
/// - Parameters:
/// - Parameter index: The index of the item to get safely the element
/// - Returns: The element if available or nil otherwise
subscript(safe index: Index) -> Element? {
return indices.contains(index) ? self[index] : nil
}
}
我发现:
jpegData(compressionQuality: CGFloat)
pngData()
总是成功,而且内存效率不高。在一个案例中,我看到一张 1.6Mb 的图像变成了 6MB 只是因为 pngData()
更新代码:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[.editedImage] as? UIImage else { return }
if let assetPath = info[.imageURL] as? URL{
let URLString = assetPath.absoluteString.lowercased()
if (URLString.hasSuffix("jpg")) {
print("JPG")
uploadedImage = image
uploadImage(type: ImageTypes.JPG)
}
else if (URLString.hasSuffix("jpeg")) {
print("JPEG")
}
else if (URLString.hasSuffix("png")) {
print("PNG")
}
else {
print("Invalid Type")
}
}
dismiss(animated: true)
}