Ios PHImageManager中的图像数据与另存为资源的图像数据不同

Ios PHImageManager中的图像数据与另存为资源的图像数据不同,ios,swift,ios9,phasset,Ios,Swift,Ios9,Phasset,您好,提前感谢您抽出时间来看我的问题 我正在创建一个位图,然后从该位图构建一个PNG。然后我将PNG保存到相册中。在通过其本地标识符取回该资产,然后使用PHImageManager检索与该资产关联的UIImage之后,我注意到图像的字节已经更改。我不确定在保存为相集时是否添加了头,但在插入的图像和检索的图像之间没有看到任何公共字节。但是,当我将检索到的图像本身放入视图中时,它看起来足够正确,所以我非常困惑 下面是演示该问题的一些示例代码 // image is a UIImage // Thi

您好,提前感谢您抽出时间来看我的问题

我正在创建一个位图,然后从该位图构建一个PNG。然后我将PNG保存到相册中。在通过其本地标识符取回该资产,然后使用PHImageManager检索与该资产关联的UIImage之后,我注意到图像的字节已经更改。我不确定在保存为相集时是否添加了头,但在插入的图像和检索的图像之间没有看到任何公共字节。但是,当我将检索到的图像本身放入视图中时,它看起来足够正确,所以我非常困惑

下面是演示该问题的一些示例代码

// image is a UIImage

// This is to show what the bytes are prior to saving
let imageRef = image.CGImage!
let cgData = CGDataProviderCopyData(CGImageGetDataProvider(imageRef))
let data = NSData(data: cgData)
let bytes = UnsafeMutablePointer<UInt8>(data.bytes)

print(data.length)
for i in 0..<16 {
    print(bytes[i])
}

var assetIdentifier: String!

// collectionIdentifier is a valid local identifier for an existing collection
let collectionFetchRequest = PHAssetCollection.fetAssetCollectionsWithLocalIdentifiers([collectionIdentifier], options: nil)
let collection = collectionFetchRequest.firstObject as! PHAssetCollection

PHPhotoLibrary.sharedPhotoLibrary().performChanges({

    let assetCreationRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
    let collectionChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: collection)!
    let assetPlaceholder = assetCreationRequest.placeholderForCreatedAsset!
    collectionChangeRequest.addAssets([assetPlaceholder])
    assetIdentifier = assetPlaceholder.localIdentifier

}) { (_, _) in

    let assetFetchRequest = PHAsset.fetchAssetsWithLocalIdentifiers([assetIdentifier], options: nil)
    let asset = assetFetchRequest.firstObject as! PHAsset

    let options = PHImageRequestOptions()
    options.synchronous = true
    options.version = .Current
    options.resizeMode = .None

    // The image is actually 64 x 64, but the targetSize doesn't seem to affect the bytes I'm getting out, I assume because the options aren't saying not to resize or crop anything
    // This was the not working code.
    // PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: CGSizeMake(256, 256), contentMode: .Default, options: options) { (retrievedImage, _) in

    // This is the working code.
    PHImageManager.defaultManager().requestImageDataForAsset(asset, options: options) { (data, _, _, _) in

        let retrievedImage = UIImage(data: data!)!

        // This is to show what the bytes are after retrieving
        let retrievedCGImage = retrievedImage!.CGImage!
        let retrievedCFData = CGDataProviderCopyData(CGImageGetDataProvider(retrievedCGImage))!
        let retrievedData = NSData(data: retrievedCFData)
        let retrievedBytes = UnsafeMutablePointer<UInt8>(retrievedData.bytes)

        // Length is the same but the bytes are not even close to right
        print(retrievedData.length)
        for i in 0..<16 {
            print(retrievedBytes[i])
        }

    }
}
//图像是一个UIImage
//这是为了显示保存前的字节数
让imageRef=image.CGImage!
设cgData=CGDataProviderCopyData(CGImageGetDataProvider(imageRef))
let data=NSData(数据:cgData)
let bytes=UnsafeMutablePointer(data.bytes)
打印(数据长度)

对于0..中的i,requestImageForAsset方法不能保证获得字节完美输出。我建议您尝试requestImageDataForAsset方法,该方法将给出您期望的结果。

requestImageForAsset方法不能保证您获得字节完美的输出。我建议您尝试requestImageDataForAsset方法,该方法将给出您期望的结果。

谢谢您的提醒。事实证明,您对requestImageDataForAsset工作的看法是正确的。我将编辑原始代码块以反映工作代码。您知道文档中哪里描述了requestImageForAsset返回的图像吗?此外,您知道有任何文档描述requestImageDataForAsset返回的数据吗?我不太熟悉图片存储机制,谢谢你的提醒。事实证明,您对requestImageDataForAsset工作的看法是正确的。我将编辑原始代码块以反映工作代码。您知道文档中哪里描述了requestImageForAsset返回的图像吗?此外,您知道有任何文档描述requestImageDataForAsset返回的数据吗?我不太熟悉图片存储机制,