首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在swift中从UIImage获取图像扩展名/格式?

如何在swift中从UIImage获取图像扩展名/格式?
EN

Stack Overflow用户
提问于 2017-12-21 08:26:28
回答 4查看 13.9K关注 0票数 7

我正在尝试上传一张图片到我的服务器上,但是在上传之前,我需要检查图片的格式是否有效。

假设我只想要.jpeg.png,所以如果用户从他们的手机上选择.gif格式的图像,我会显示一些警告。

我从用户图库/相机获取图像,然后我想检查格式,但我不知道如何检查格式

代码语言:javascript
复制
@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)
}

如何检查该格式?

我曾尝试在谷歌上寻找,但我只是得到了图像格式,如果它是从URL派生的。不是像这样直接从UIImage

代码语言:javascript
复制
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)
EN

Stack Overflow用户

发布于 2020-10-26 19:54:31

如果您更喜欢使用URL,在swift 5.2中,您可以使用

代码语言:javascript
复制
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({ $0 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
    }
    
}

我发现:

代码语言:javascript
复制
jpegData(compressionQuality: CGFloat)
pngData()

总是成功,而且内存效率不高。在一个例子中,我看到一个1.6Mb的图像因为pngData()而变成了6MB。

票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47916207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档