iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

前言

  • 由於先前在進行開發的時候,為了要趕快生出樣式和外觀,以至於在規劃上沒有反覆檢視,有些地方我後來看起來覺得設計得不夠直覺。
  • 直覺的意思是,即使好一陣子沒看這串程式碼,在短時間內回顧可以一目瞭然。
  • 寫到這邊看起來像是在記開發流水帳,不過這些內容之後會在進行調整。

匯入圖片/拍攝照片

參考官方案例開啟相機

存進系統的相簿

從相簿或相機中提取內容到程式裡

實作程式碼

程式概念

  • AddStampAlert 確認圖檔後,要提供一個函式用來儲存相片到檔案
  • 寫個 function 接收 UIImage
  • 透過 FileManager 讀取 App 運行中的沙盒路徑
  • 在執行沙盒中建立目錄,用來堆放圖資
  • 拼湊出新檔案的路徑
  • 將 UIImage 以 UIImage 本身提供的方法 .pngData() 將圖片以 PNG 格式載入變數,以便稍後另存成檔案
  • 建議參考 Apple 開發手冊: pngData
  • 同場加映:jpegData
func saveFishPicToFile(_ image: UIImage) {
    print("store fish pic locally")
    // Create Dir
    let manager = FileManager.default
    guard let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first else {
        return
    }
    //print(url.path)
    let newFolderUrl = url.appendingPathComponent("saved")
    do {
        try manager.createDirectory(at: newFolderUrl, withIntermediateDirectories: true)
    } catch {
        print(error)
    }
    // Create file
    let fileUrl = newFolderUrl.appendingPathComponent("\(newStampName).png")
    print(fileUrl)  // 編碼會變成 url 型態,所以中文字會變成 %E4%BD%A0 這種樣子
    let pngData = image.pngData()
    //let path = documentDirectoryPath()?.appendingPathComponent("/pics/\(newStampName).png")
    try? pngData?.write(to: fileUrl)
    print("save pic to \(fileUrl)")
}

備註

  • 使用 Assets
    1. 寫:製作程式時,放入 Assets.xcassets (只能在製作程式的時候放進去,程式不能寫資料進來)
    2. 讀:直接由 Image("圖檔名字") 取用
  • 相片五部曲
    1. 拍照或讀取照相簿 ImagePickerUIImage
    2. UIImage離線 PNG 檔案
    3. 離線 PNG 檔案Image
    4. 離線 PNG 檔案S3
    5. S3離線 PNG 檔案

上一篇
【Day 20】 相片五部曲之一: 藉由 ImagePicker 選擇讀取相片來源
下一篇
【Day 22】 相片五部曲之三:從離線 PNG 檔案至 SwiftUI Image
系列文
依然無法成為釣魚大師也要努力摸魚!!辣個吃魚神器 APP 第二彈33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言