如何从本地文件创建缩略图

时间:2019-05-15 12:35:44

标签: swift xcode

我想为文件(word,excel,视频...)创建缩略图。 这是我做的:

import QuickLook

class ThumbsCreator:  NSObject {

    private var file : File?

    init(file: File?) {
        super.init()
        self.file = file
    }

    func createThumb() {
     let url = URL(string: (self.file?.path()))
 }  

4 个答案:

答案 0 :(得分:1)

您可以使用https://developer.apple.com/documentation/uikit/uidocumentinteractioncontroller/1616801-icons

var icons: [UIImage] { get }


let controller = UIDocumentInteractionController(url:someUrl) 
print(controller.icons.first)

仅用于视频

extension UIViewController {

    func thumbnail(_ sourceURL:URL) -> UIImage {
        let asset = AVAsset(url: sourceURL)
        let imageGenerator = AVAssetImageGenerator(asset: asset)
        imageGenerator.appliesPreferredTrackTransform = true
        let time = CMTime(seconds: 1, preferredTimescale: 1)

        do {
            let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
            return UIImage(cgImage: imageRef)
        } catch {
            print(error)
            return UIImage(named: "NoVideos")!
        }
    }

}

答案 1 :(得分:1)

从iOS 13和macOS 10.15开始,有QuickLook Thumbnailing API。它支持OS可以为其提供预览的任何文件格式:由于OS知道该格式,或者因为第三方格式的所有者提供了QuickLook插件。

这是一个基于Apple教程的示例:

tmpMutPop[1][RandomNums[1]] = LocalBestInd[1][RandomNums[0]]

在10.15之前的macOS上,在我的应用中,我后退到func thumbnail(for fileURL: URL, size: CGSize, scale: CGFloat) { let request = QLThumbnailGenerator .Request(fileAt: fileURL, size: size, scale: scale, representationTypes: .lowQualityThumbnail) QLThumbnailGenerator.shared.generateRepresentations(for: request) { (thumbnail, type, error) in DispatchQueue.main.async { if thumbnail == nil || error != nil { // Handle the error case gracefully. } else { // Display the thumbnail that you created. } } } } ,该按钮根据文件类型(而非缩略图)提供文档图标。

答案 2 :(得分:0)

目前还没有好的API。有NSURLThumbnailDictionaryKey,但YMMV。您确实可以通过UIDocumentInteractionController获得图标。

答案 3 :(得分:0)

经过大量搜索,我找到了这个解决方案:

import PDFKit
import AVKit
import WebKit

func createThumb() {
     let url = URL(string: (self.file?.path()))
     switch file?.type {
     case: FileType.image.rawValue:
          let image = UIImage(contentsOfFile: (url?.path)!)
          _finalImage = self.createScaledImage(image: image!)
          break 
     case: FileType.office.rawValue:  
          //Loading.......
          break
     case FileType.Pdf.rawValue:
          guard let doc = PDFDocument(url: url!) else {return}
          guard let page = doc.page(at: 0) else {return}
          _finalImage = page.thumbnail(of: CGSize(width: 768, height: 1024), for: .cropBox)
          break
     case: FileType.video.rawValue:
          let asset = AVAsset(url: url!)
          let imageGenerator = AVAssetImageGenerator(asset: asset)
          imageGenerator.appliesPreferredTrackTransform = true
          let time = CMTime(seconds: 2, preferredTimescale: 1)
          do {
          let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
          _finalImage = UIImage(cgImage: imageRef)
          } catch let error{
            print("Error: \(error)")
          }
         break

}
 } 

func createScaledImage(image: UIImage) {

    let THUMB_WIDTH = 150.0 - 40.0
    let THUMB_HEIGHT = THUMB_WIDTH - 23.0
    var itemThumb = resizeImage(image: image, constraintSize: CGSize(width: THUMB_WIDTH, height: THUMB_HEIGHT))
    let thumbRect = CGRect(x: 0, y: 0, width: 10, height: 10)
    UIGraphicsBeginImageContextWithOptions(thumbRect.size, true, 0.0)
    let context = UIGraphicsGetCurrentContext()

    // Fill a white rect
    context?.setFillColor(gray: 1.0, alpha: 1.0)
    context?.fill(thumbRect)

    // Stroke a gray rect
    let comps : [CGFloat] = [0.8, 0.8, 0.8, 1]
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let strokeColor = CGColor(colorSpace: colorSpace, components: comps)
    context?.setStrokeColor(strokeColor!)
    UIRectFrame(thumbRect)
    //CGColorRelease(strokeColor!)

    itemThumb.draw(in: thumbRect.insetBy(dx: 1, dy: 1))

    itemThumb = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    self.finishThumCreation(image: image)
} 
}