2015-04-15 16 views
6

Tôi đang tải xuống hình ảnh từ phân tích cú pháp với tệp totes PNG và JPEG.Nhận loại tệp hình ảnh lập trình trong swift

Khi hình ảnh được tải xuống ứng dụng tôi cần xác định loại tệp nào để tôi có thể xử lý hình ảnh cho phù hợp.

Đã xem API cho uiimageview và đã thực hiện tìm kiếm nhưng không thể tìm thấy giải pháp nào nhanh chóng.

Bất kỳ đầu vào đánh giá cao

Đang cố gắng để có được url từ 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

Bummer. Sau khi tôi tải xuống hình ảnh, tôi lưu hình ảnh cục bộ trên thiết bị, sau đó lưu URL vào dữ liệu cốt lõi, tại đây tôi cần phải xác định đó là PNG hoặc JPG – dancingbush

Trả lời

10

Cập nhật cho Swift 3.0.2

Dựa trên câu trả lời Hòa và 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 
     } 
    } 
} 

Cách sử dụng

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

Bạn có thể sử dụng điều này với cả hai địa phương và hình ảnh trực tuyến.

4

Bạn có để có được byte đầu tiên của hình ảnh của bạn trong hệ nhị phân. Byte này cho biết loại hình ảnh nào. Dưới đây là đoạn code mà tôi đã sử dụng cho dự án của tôi nhưng trong 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"); 
     } 

Hãy thử với điều này trong nhanh chóng (1.2, nếu không bạn phải sử dụng 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

Cảm ơn bạn sẽ thử chuyển đổi thành nhanh và có giao diện – dancingbush

+0

Bạn có thể tìm thêm thông tin tại đây: http://stackoverflow.com/questions/4147311/finding-image-type-from-nsdata-or-uiimage –

+0

Xin chào, tôi đã thử giải pháp của bạn và nó đã hoạt động sau khi tôi thay đổi: var c = [UInt8]() thành var c = [UInt8] (đếm: 1, repeatValue: 0) Mảng phải có khoảng trống cho ít nhất một byte. – Naijaba

1

tôi muốn để biết phần mở rộng nào là hình ảnh của tôi sau khi tôi đã chọn nó. Tôi sử dụng này:

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

Tại sao không chỉ đơn giản là làm như sau:

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

này sẽ cung cấp cho bạn phần mở rộng của tập tin.

0

Bạn có thể kiểm tra trong dự án https://github.com/bonyadmitr/ImageFormat

thêm vào dự án

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

Sử dụng

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 
Các vấn đề liên quan