ios UIImageJPEGRepresentation() 大图像崩溃
ios UIImageJPEGRepresentation() with large image crash
我正在使用 xcode 9 和 iPhone SE 开发 iOS 应用程序。
我从 iPhone 相册中得到一张 NSData
格式的 19MB JPEG
图片的大照片。
然后我需要修复这张照片的方向,所以我必须将这张照片从 NSData
转换为 UIImage
。
然后我需要将此 UIImage
还原为 NSData(less than 20MB)
。
当我尝试使用 UIImageJPEGRepresentation()
时,设备内存飙升至 1.2G 并崩溃。
当我尝试用户 UIImagePNGRepresentation()
时,结果 NSData
对象大于 20MB。
我不知道该怎么做。
谁能帮忙?谢谢!
我想一个 19MB 的未压缩 jpeg 会占用大量 space。我对您的设备内存增加这么多并不感到惊讶。 Jpeg 在其属性数据中存储方向属性。为避免必须解压缩 jpeg,您可以只编辑属性数据以修复方向。
如果 imageData 是您的 jpeg 数据,您可以按如下方式编辑属性。这使用 Swift Data 对象,但您可以相当轻松地在 NSData 和 Data 之间跳转
// create an imagesourceref
if let source = CGImageSourceCreateWithData(imageData as CFData, nil) {
// get image properties
var properties : NSMutableDictionary = [:]
if let sourceProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) {
properties = NSMutableDictionary(sourceProperties)
}
// set image orientation
properties[kCGImagePropertyOrientation] = 4
if let uti = CGImageSourceGetType(source) {
// create a new data object and write the new image into it
let destinationData = NSMutableData()
if let destination = CGImageDestinationCreateWithData(destinationData, uti, 1, nil) {
// add the image contained in the image source to the destination, overidding the old metadata with our modified metadata
CGImageDestinationAddImageFromSource(destination, source, 0, properties)
if CGImageDestinationFinalize(destination) == false {
return nil
}
return destinationData as Data
}
}
}
方位值如下
纵向 = 6
纵向颠倒 = 8
landscape_volumebuttons_up = 3
landscape_powerbutton_up = 1
我正在使用 xcode 9 和 iPhone SE 开发 iOS 应用程序。
我从 iPhone 相册中得到一张 NSData
格式的 19MB JPEG
图片的大照片。
然后我需要修复这张照片的方向,所以我必须将这张照片从 NSData
转换为 UIImage
。
然后我需要将此 UIImage
还原为 NSData(less than 20MB)
。
当我尝试使用 UIImageJPEGRepresentation()
时,设备内存飙升至 1.2G 并崩溃。
当我尝试用户 UIImagePNGRepresentation()
时,结果 NSData
对象大于 20MB。
我不知道该怎么做。 谁能帮忙?谢谢!
我想一个 19MB 的未压缩 jpeg 会占用大量 space。我对您的设备内存增加这么多并不感到惊讶。 Jpeg 在其属性数据中存储方向属性。为避免必须解压缩 jpeg,您可以只编辑属性数据以修复方向。
如果 imageData 是您的 jpeg 数据,您可以按如下方式编辑属性。这使用 Swift Data 对象,但您可以相当轻松地在 NSData 和 Data 之间跳转
// create an imagesourceref
if let source = CGImageSourceCreateWithData(imageData as CFData, nil) {
// get image properties
var properties : NSMutableDictionary = [:]
if let sourceProperties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) {
properties = NSMutableDictionary(sourceProperties)
}
// set image orientation
properties[kCGImagePropertyOrientation] = 4
if let uti = CGImageSourceGetType(source) {
// create a new data object and write the new image into it
let destinationData = NSMutableData()
if let destination = CGImageDestinationCreateWithData(destinationData, uti, 1, nil) {
// add the image contained in the image source to the destination, overidding the old metadata with our modified metadata
CGImageDestinationAddImageFromSource(destination, source, 0, properties)
if CGImageDestinationFinalize(destination) == false {
return nil
}
return destinationData as Data
}
}
}
方位值如下
纵向 = 6
纵向颠倒 = 8
landscape_volumebuttons_up = 3
landscape_powerbutton_up = 1