IOS: Hiểu thêm về dữ liệu hình ảnh cũng như video cũng như cách sử lý dữ liệu này tuỳ mục đích sử dụng trong swift.

1. Khi nào chúng ta cần sử dụng những dữ liệu này.

  • Ở đây đơn cử các trường hợp như khi chúng ta phát sinh nhu cầu gởi hình ảnh lên để mô tả chi tiết cho nội dung cần truyền tải như : Nội dung đính kèm theo bài viết, trong tin nhắn của ứng dụng nhắn tin, chọn hình ảnh để làm background ....

2. Hiểu về dữ liệu trả về khi thực hiện tác vụ lấy hình ảnh trả về.

  • Có nhiều cách dể lấy dữ liệu trả về khi chúng ta tương tác với thư viện hình ảnh của máy như: dùng các hàm sẵn có của hệ thông thông qua UIImageUIImagePickerControllerDelegate hoặc các thư viện về UIimagePiker ... trong bài viết này mình sẽ không đề cập đến cách lấy hình ảnh mà chỉ nói đến vấn đề sử lý dữ liệu trả về.

VD: khi ta chọn hình ảnh trong thư viện ảnh sử dụng hàm sẵn có của swift :

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}

Ta có thấy sau khi hoàn thành việc chọn ảnh hàm này trả về cho ta biến info kiểu dictionary. ví dụ :

  ▿ 0 : 2 elements
    - key : "UIImagePickerControllerEditedImage"
    - value : <UIImage: 0x17428be00> size {638, 640} orientation 0 scale 1.000000
  ▿ 1 : 2 elements
    - key : "UIImagePickerControllerMediaType"
    - value : public.image
  ▿ 2 : 2 elements
    - key : "UIImagePickerControllerCropRect"
    - value : NSRect: {{0, 278}, {720, 721}}
  ▿ 3 : 2 elements
    - key : "UIImagePickerControllerReferenceURL"
    - value : assets-library://asset/asset.JPG?id=D2F8DFCA-0668-4CE5-9BF0-F0DD78F8177C&ext=JPG
  ▿ 4 : 2 elements
    - key : "UIImagePickerControllerOriginalImage"
    - value : <UIImage: 0x1742901d0> size {720, 1280} orientation 0 scale 1.000000

như ta thấy với mỗi key tương ứng chúng ta có thể lấy được dữ liệu chúng ta mong muốn. Ta có thể thấy key "UIImagePickerControllerOriginalImage""UIImagePickerControllerEditedImage" sẽ trả về cho chúng ta giá trị thuộc kiểu UIimage và key "UIImagePickerControllerReferenceURL" sẽ trả về URL của hình ảnh.

  • Với những giá trị trả về chúng ta có thể lấy được các thông tin mong đợi như width , height , size của hình cũng như url. Cách thực hiện :
    • Lấy width , heigh chúng ta có thể gọi biến image để hứng giá trị và cast về kiểu UIImage để lấy thuộc tính width , height
guard let image = info["UIImagePickerControllerOriginalImage"] as? UIImage else {return} 
let image = Int(selectedImage.size.width)
let image = Int(selectedImage.size.height)
  • về ReferenceURL đây là điểm khác biệt, ở đây URL trả về là một URL mặc định trong asset của device chúng ta ko thể thao tác với URL này như upload ảnh lên những sever lưu trữ của chúng ta bằng đường dẫn này. Vậy làm sao để có thể làm lấy đc url có thể sử dung được. Lúc này giải pháp là chúng ta phải ghi data ra Document của device và sử dụng URL từ nơi chúng ta mới ghi data vào.
    • cách thức thực hiện: -B1 : viết hàm tạo đường dẫn
         func getDocumentsDirectory() -> URL {
       let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
       let documentsDirectory = paths[0]
       return documentsDirectory
      }
      
    • B2: khi đã có hàm khởi tạo đường dẫn lúc này trong hàm didFinishPickingMediaWithInfo chúng ta tạo đường dẫn để ghi hình ảnh lấy trừ thư viện ảnh
      let imageURL = self.getDocumentsDirectory().appendingPathComponent("Photo.png")
      
    • B3: Ghi dữ liệu vào đường dẫn khởi tạo :
      if let data = UIImagePNGRepresentation(image) {
      try? data.write(to: imageURL)
      let imageSize = data.count
      
    • bây h chúng ta đã có Url mới có hình ảnh đã ghi vào là imageURL , và size của hình ảnh . ví dụ như chúng ta có một func upload ảnh chúng ta có thể dùng những dữ liệu này để đưa vào. Sau khi ghi chúng ta sẽ có một URL mới có dạng
      file:///var/mobile/Containers/Data/Application/119C5BA3-E507-40C1-8CED-93A0E6047770/Documents/Photo.jpg
      

3. Với dữ liệu trả về là Video.

  • Với 2 kiểu dữ liệu này thì dữ liệu trả về thường trả về là AVAsset. Kiểu dữ liệu này có những thuộc tính gì. Mình sẽ liệt kê một số thuộc tính cơ bản và cách để lấy thuộc tính đó từ dữ liệu trả về thuộc kiểu AVAsset.
  • Thuộc tính: Duration, Width, Height . lấy 1 frame hình từ video để làm thumbnail , size , url
  • Cách lấy :

    • duration
      let timeDuration = avAsset.duration.seconds
      
    • size, url, width,height

                            guard let avAsseturl = avAsset as? AVURLAsset else {return}
                          var tracks: [Any] = avAsseturl.tracks(withMediaType: AVMediaTypeVideo)
                          let track: AVAssetTrack? = (tracks[0] as? AVAssetTrack)
                          let mediaSize: CGSize? = track?.naturalSize
      
                          let mediaUrlStr = avAsseturl.url.path
                          let mediaWidth  = mediaSize?.width
                          let mediaHeight = mediaSize?.height
                          let mediaFizeSize = avAsset.calculateFileSize()
      
    • Frame hình từ video ở đây mình lấy frame giữa video

      var time = avAsset.duration
      time.value = time.value/2
      var thumbnail: UIImage = UIImage()
      do {
            let imageRef = try assetImageGenerator.copyCGImage(at: time, actualTime: nil)
            thumbnail = UIImage(cgImage: imageRef)
      }   catch (let err) {
      print(err.localizedDescription)
      }
      
    • cũ giống như với hình để có sử dụng dữ liệu này để upload các bạn cần ghi dữ liệu ra document để sử dụng tương tự như với Photo
    var dataAV : Data = Data()
    
    let fileURL = self.getDocumentsDirectory().appendingPathComponent((avAsseturl.url.lastPathComponent))
    do {
         dataAV = try Data(contentsOf: avAsseturl.url)
         try dataAV.write(to: fileURL)
    }   catch (let err) {
     print(err.localizedDescription)
    }
    
  • Như vậy chúng ta có thể sử dụng được các thuộc tính sau khi kết thúc chọn video từ thư viện để sử dụng tuỳ mục đích ứng dụng

Hy vọng bài viết sẽ giúp ích các bạn trong việc thao tác với dữ liệu hình ảnh cũng như video trong swift

Tuan Nguyen

results matching ""

    No results matching ""