2015-04-15 3 views
6

Я загружаю изображения из синтаксиса с файлами в PNG и JPEG.Получить тип файла изображения программно в swift

Когда изображение загружается в приложение, мне нужно определить тип файла, чтобы я мог обрабатывать изображение соответствующим образом.

Посмотрел API для uiimageview и сделал поиск, но не нашел решения в swift.

Любой вклад оценил

Попытки получить URL из PFFIle §:

let imageURLFromParse = NSURL(string : caseImageFile2.url); 

// Error here: 'NSURL?' does not have a member named 'pathExtension'     
if(imageURLFromParse.pathExtension!.lowercaseString == ".jpg" || imageURLFromParse.pathExtension.lowercaseString == ".jpeg"){ 

    println("Parse image ext is a jpg: \(imageURLFromParse.pathExtension.lowercaseString)"); 

    fileExtenion = ".jpg"; 

} else {       
    println("Parse image is a png: \(imageURLFromParse.pathExtension.lowercaseString)"); 

    fileExtenion = ".png";       
} 
+0

облом. После загрузки изображения я сохраняю изображение локально на устройстве, а затем сохраняю URL-адрес для основных данных. Здесь мне нужно идентифицировать, что это PNG или JPG. – dancingbush

ответ

10

обновление для Swift 3.0.2

Основываясь на ответ Хоа и Kingfisher library

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

Использование

let imageURLFromParse = NSURL(string : "https://i.stack.imgur.com/R64uj.jpg") 
let imageData = NSData(contentsOf: imageURLFromParse! as URL) 
print(imageData!.imageFormat) 

Вы можете использовать это с местными и онлайн-изображения.

4

Вы должны получить первые байты вашего изображения в двоичном виде. Этот байт указывает, какой тип изображения. Вот код, который я использовал для моего проекта, но в Objective-C:

uint8_t c; 
     [_receivedData getBytes:&c length:1]; 

     NSString *extension = @"jpg"; 

     switch (c) { 
      case 0xFF: 
      { 
       extension = @"jpg"; 
      } 
      case 0x89: 
      { 
       extension = @"png"; 
      } 
       break; 
      case 0x47: 
      { 
       extension = @"gif"; 
      } 
       break; 
      case 0x49: 
      case 0x4D: 
      { 
       extension = @"tiff"; 
      } 
       break; 
      default: 
       FLog(@"unknown image type"); 
     } 

Попробуйте с этим в стриж (1,2, иначе вы должны использовать var ext):

func imageType(imgData : NSData) -> String 
{ 
    var c = [UInt8](count: 1, repeatedValue: 0) 
    imgData.getBytes(&c, length: 1) 

    let ext : String 

    switch (c[0]) { 
    case 0xFF: 

     ext = "jpg" 

    case 0x89: 

     ext = "png" 
    case 0x47: 

     ext = "gif" 
    case 0x49, 0x4D : 
     ext = "tiff" 
    default: 
     ext = "" //unknown 
    } 

    return ext 
} 
+0

Спасибо, попробуем конвертировать в быстрый и посмотреть. – dancingbush

+0

. Вы можете найти больше информации здесь: http://stackoverflow.com/questions/4147311/finding-image-type-from-nsdata-or-uiimage –

+0

Привет, я попробовал ваше решение, и он работал после того, как я изменил: var c = [UInt8]() в var c = [UInt8] (count: 1, repeatValue: 0) Массив должен иметь место для хотя бы одного байта. – Naijaba

1

Я хотел чтобы узнать, какое расширение является моим изображением после того, как я его выбрал. Я использовал это:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    if (!(picker.sourceType == UIImagePickerControllerSourceType.Camera)) { 
    let assetPath = info[UIImagePickerControllerReferenceURL] as! NSURL 
    if assetPath.absoluteString.hasSuffix("JPG") { 
0

Почему бы не просто сделать следующее:

let ext = NSURL(fileURLWithPath: path/of/your/file as! String).pathExtension 
print(ext!) 

Это даст вам расширение файла.

0

Вы можете проверить в проекте https://github.com/bonyadmitr/ImageFormat

Добавить в проект

import Foundation 

/// can be done "heic", "heix", "hevc", "hevx" 
enum ImageFormat: String { 
    case png, jpg, gif, tiff, webp, heic, unknown 
} 

extension ImageFormat { 
    static func get(from data: Data) -> ImageFormat { 
     switch data[0] { 
     case 0x89: 
      return .png 
     case 0xFF: 
      return .jpg 
     case 0x47: 
      return .gif 
     case 0x49, 0x4D: 
      return .tiff 
     case 0x52 where data.count >= 12: 
      let subdata = data[0...11] 

      if let dataString = String(data: subdata, encoding: .ascii), 
       dataString.hasPrefix("RIFF"), 
       dataString.hasSuffix("WEBP") 
      {  
       return .webp 
      } 

     case 0x00 where data.count >= 12 : 
      let subdata = data[8...11] 

      if let dataString = String(data: subdata, encoding: .ascii), 
       Set(["heic", "heix", "hevc", "hevx"]).contains(dataString) 
       ///OLD: "ftypheic", "ftypheix", "ftyphevc", "ftyphevx" 
      {  
       return .heic 
      } 
     default: 
      break 
     } 
     return .unknown 
    } 

    var contentType: String { 
     return "image/\(rawValue)" 
    } 
} 

Использование

for file in ["1.jpg", "2.png", "3.gif", "4.svg", "5.TIF", "6.webp", "7.HEIC"] { 
    if let data = Data(bundleFileName: file) { 
     print(file, ImageFormat.get(from: data)) 
    } 
} 

/// Result 
/// 1.jpg jpg 
/// 2.png png 
/// 3.gif gif 
/// 4.svg unknown 
/// 5.TIF tiff 
/// 6.webp webp 
/// 7.HEIC heic 
Смежные вопросы