菜鸟教程小白 发表于 2022-12-12 23:46:35

ios - 如何将 UIImage 转换为 BMP 并另存为数据(不是 JPG 或 PNG)


                                            <p><p>我正在我的 iOS 应用程序 (Swift 3) 和仅支持 BMP 格式的应用程序(在 MS Windows 上)之间同步 BMP 图像。</p>

<p>在 MS Windows 应用程序上创建的 BMP 图像被下载为 base64 字符串,保存为 <code>Data</code> 并使用以下几行代码非常容易地显示:</p>

<pre><code>let imageData = Data(base64Encoded: value)
let image = UIImage(data: imageData)
</code></pre>

<p>这是从下载的 BMP 图像生成 <code>UIImage</code> 并且工作完美,因为我可以显示图像。</p>

<p>但我还需要从 iOS 应用程序创建 BMP 图像(绘制的签名),为此,我正在使用这个库 <a href="https://github.com/felipesantolim/SHFSignature" rel="noreferrer noopener nofollow">https://github.com/felipesantolim/SHFSignature</a> ,感谢 Felipe。</p>

<p>此库生成一个 <code>UIImage</code>,我将其保存为 <code>Data</code>,然后我可以在我的 iOS 应用程序上显示它。</p>

<p>但是当我将它作为 base64 字符串发送时,问题是 se MS Windows 应用程序无法显示它(不支持格式,仅 BMP 图像)。</p>

<p>谁能帮我从 <code>UIImage</code> 或直接从 <code>SHFSignature</code> 图像函数生成真实的 BMP 图像?</p>

<p>谢谢</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我需要做同样的事情 - 从 iOS 获取 UIImage 并将其保存到可用的 Windows .bmp 文件中。我实际上是在 Adafruit PyPortal IoT 设备上使用它,而不是在 Windows 机器上,但下面的技术运行良好。将数据保存到 Firebase 存储并能够在 PyPortal 中使用它。</p>

<p>我在这里找到了一个有用的扩展:
<a href="https://stackoverflow.com/questions/32297704/convert-uiimage-to-nsdata-and-convert-back-to-uiimage-in-swift/50729656" rel="noreferrer noopener nofollow">Convert UIImage to NSData and convert back to UIImage in Swift?</a> </p>

<p>我使用了这个扩展:
//请注意,您需要导入 MobileCoreServices 才能识别 k 个值</p>

<pre><code>import MobileCoreServices

extension UIImage {

    func toJpegData (compressionQuality: CGFloat, hasAlpha: Bool = true, orientation: Int = 6) -&gt; Data? {
      guard cgImage != nil else { return nil }
      let options: NSDictionary =   [
            kCGImagePropertyOrientation: orientation,
            kCGImagePropertyHasAlpha: hasAlpha,
            kCGImageDestinationLossyCompressionQuality: compressionQuality
      ]
      return toData(options: options, type: .jpeg)
    }

    func toData (options: NSDictionary, type: ImageType) -&gt; Data? {
      guard cgImage != nil else { return nil }
      return toData(options: options, type: type.value)
    }

    // about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage
    func toData (options: NSDictionary, type: CFString) -&gt; Data? {
      guard let cgImage = cgImage else { return nil }
      return autoreleasepool { () -&gt; Data? in
            let data = NSMutableData()
            guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil }
            CGImageDestinationAddImage(imageDestination, cgImage, options)
            CGImageDestinationFinalize(imageDestination)
            return data as Data
      }
    }

    // https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types
    enum ImageType {
      case image // abstract image data
      case jpeg                     // JPEG image
      case jpeg2000                   // JPEG-2000 image
      case tiff                     // TIFF image
      case pict                     // Quickdraw PICT format
      case gif                        // GIF image
      case png                        // PNG image
      case quickTimeImage             // QuickTime image format (OSType &#39;qtif&#39;)
      case appleICNS                  // Apple icon data
      case bmp                        // Windows bitmap
      case ico                        // Windows icon data
      case rawImage                   // base type for raw image data (.raw)
      case scalableVectorGraphics   // SVG image
      case livePhoto                  // Live Photo

      var value: CFString {
            switch self {
            case .image: return kUTTypeImage
            case .jpeg: return kUTTypeJPEG
            case .jpeg2000: return kUTTypeJPEG2000
            case .tiff: return kUTTypeTIFF
            case .pict: return kUTTypePICT
            case .gif: return kUTTypeGIF
            case .png: return kUTTypePNG
            case .quickTimeImage: return kUTTypeQuickTimeImage
            case .appleICNS: return kUTTypeAppleICNS
            case .bmp: return kUTTypeBMP
            case .ico: return kUTTypeICO
            case .rawImage: return kUTTypeRawImage
            case .scalableVectorGraphics: return kUTTypeScalableVectorGraphics
            case .livePhoto: return kUTTypeLivePhoto
            }
      }
    }
}
</code></pre>

<p>我在我的代码中这样调用它:</p>

<p>(我正在转换的图像是一个名为 <code>backgroundImage</code> 的 <code>UIImage</code> 值,它是下面代码所在的类的属性)。</p>

<pre><code>let options: NSDictionary =   [:]
let convertToBmp = self.backgroundImage.toData(options: options, type: .bmp)
guard let bmpData = convertToBmp else {
    print(&#34;
页: [1]
查看完整版本: ios - 如何将 UIImage 转换为 BMP 并另存为数据(不是 JPG 或 PNG)