在Swift

时间:2019-07-15 06:03:20

标签: swift uiimage thumbnails image-resizing

我想获取一个UIImage并输出其100 x 100版本以用作缩略图。我在SO上找到了一些有关如何在Objective-C中执行此操作的答案,但并不迅速,并且不确定从哪里开始。我还找到了链接(https://nshipster.com/image-resizing/#technique-3-creating-a-thumbnail-with-image-io),这表明它不像我希望的那样简单明了。该链接使我希望其中一种方法可以起作用,但是每种方法都引用一个URL参数,这使我感到困惑,因为我以UIImage作为输入开始。

在类似的情况下(用户从手机上传图片),我使用下面的代码从资产创建缩略图,当输入的是UIImage而不是PHAsset时,我正在寻求帮助,以做同样的事情。

func getAssetThumbnail(asset: PHAsset) -> UIImage {
        let manager = PHImageManager.default()
        let option = PHImageRequestOptions()
        var thumbnail = UIImage()
        option.isSynchronous = true

        manager.requestImage(for: asset, targetSize: CGSize(width: 100, height: 100), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
            thumbnail = result!
        })
        return thumbnail
    }

3 个答案:

答案 0 :(得分:0)

测试了代码,对我来说很好用:-(Swift 5.0)

  #...
  sig { returns(String) }
  def first_argument; ""; end
  sig { returns(T.nilable(String)) }
  def second_argument; end

答案 1 :(得分:0)

为了将来参考,我刚刚遇到了同样的问题,这个线程有一些很好的解决方案:Creating a thumbnail from UIImage using CGImageSourceCreateThumbnailAtIndex

我选择了这个,它在 Swift 5.3 中运行良好:

let uiImage = someUIImage

let options = [
    kCGImageSourceCreateThumbnailWithTransform: true,
    kCGImageSourceCreateThumbnailFromImageAlways: true,
    kCGImageSourceThumbnailMaxPixelSize: 100] as CFDictionary

guard let imageData = uiImage.pngData(),
      let imageSource = CGImageSourceCreateWithData(imageData as NSData, nil),
      let image = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options)
else {
    return nil
}

return UIImage(cgImage: image)

答案 2 :(得分:0)

iOS 15 向 UIImage 添加了以下测试版 API。

func prepareThumbnail(of: CGSize, completionHandler: (UIImage?) -> Void)
func preparingThumbnail(of: CGSize) -> UIImage?

https://developer.apple.com/documentation/uikit/uiimage/