我在我的iOS应用程序(Swift 3)和仅支持BMP格式的应用程序(在MS Windows上)之间同步BMP图像。
在MS Windows应用程序上创建的BMP图像将作为base64字符串下载,保存为Data
,并使用以下代码行轻松显示:
let imageData = Data(base64Encoded: value)
let image = UIImage(data: imageData)
这是从下载的BMP图像生成UIImage
并且完美地运行,因为我会显示图像。
但我还需要从iOS应用程序创建BMP图像(绘制的签名),为此,我正在使用此库https://github.com/felipesantolim/SHFSignature,感谢Felipe。
此库生成UIImage
我保存为Data
,我可以在我的iOS应用中显示它。
但是当我将它作为base64字符串发送时,问题是那些MS Windows应用程序无法显示它(格式不受支持,只有BMP图像)。
有人可以帮助我从UIImage
或直接从SHFSignature
图像功能生成真实的BMP图像吗?
由于
答案 0 :(得分:1)
我需要做同样的事情-从iOS获取UIImage并将其保存到可用的Windows .bmp文件中。我实际上是在Adafruit PyPortal IoT设备(而不是Windows机器)上使用它的,但是下面的技术效果很好。将数据保存到Firebase Storage并能够在PyPortal中使用。
我在这里找到了一个有用的扩展名: Convert UIImage to NSData and convert back to UIImage in Swift?
我使用了这个扩展名:
extension UIImage {
func toJpegData (compressionQuality: CGFloat, hasAlpha: Bool = true, orientation: Int = 6) -> 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) -> 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) -> Data? {
guard let cgImage = cgImage else { return nil }
return autoreleasepool { () -> 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 'qtif')
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
}
}
}
}
我在代码中这样调用它:
(我正在转换的图像是一个名为backgroundImage的UIImage值,它是下面代码所在的类的属性。)
let options: NSDictionary = [:]
let convertToBmp = self.backgroundImage.toData(options: options, type: .bmp)
guard let bmpData = convertToBmp else {
print(" ERROR: could not convert image to a bitmap bmpData var.")
return
}
干杯!