Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get Image extension/format from UIImage in swift?

I am trying to upload an image to my server, but before uploading, i need to check whether it is valid format or not.

let say i only want .jpeg and .png only, so if the users pick .gif format image from their phone, I will show some alert.

I get the image from the user gallery/camera, and then I want to check the format, but I don't know how to check the format

@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)
}

How do I check that format?

i have tried to find on google, but I just get the image format if it is derived from an URL. not directly from UIImage like this

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)
like image 306
Alexa289 Avatar asked Dec 21 '17 00:12

Alexa289


2 Answers

You can try this:

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")
    }
}
like image 78
iOS Geek Avatar answered Oct 16 '22 21:10

iOS Geek


You need to cover the image to raw data, probably using UIImagePNGRepresentation() or UIImageJPEGRepresentation(), then send THAT up to your server. That data will be in either PNG or JPEG format, respectively.

like image 26
Ben Gottlieb Avatar answered Oct 16 '22 19:10

Ben Gottlieb