- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,在此先感谢您花时间查看我的问题。
我正在创建一个位图,然后从该位图构建一个 PNG。然后我将该 PNG 保存到相册中。通过其本地标识符取回该 Assets ,然后使用 PHImageManager 检索与该 Assets 关联的 UIImage 后,我注意到图像的字节已更改。我不确定在另存为 PHAsset 时是否添加了 header 或什么,但我真的看不到插入和检索图像之间的任何公共(public)字节。但是,当我将检索到的图像本身放入 View 中时,它看起来很正确,所以我很困惑。
以下是演示问题的一些示例代码。
// 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])
}
}
}
请随时更正此代码中任何不正确或低效的部分。这段代码应该可以运行,所以如果您看到任何语法错误或输入错误的变量,这些错误仅出现在 StackOverflow 上,而不出现在 XCode 中,因此它们不是导致此字节问题的原因。另外就图像中的字节而言,我不关心第 4 个字节,它是 alpha 组件,因为从我目前的测试来看它总是 255。如果有人知道我如何利用这第 4 个字节,而无需在保存图像时将其设置为 255 或只是没有 alpha 组件,那也会很有帮助。
再次感谢您的时间和考虑!
编辑:
以下是对回答者的完整回复:
感谢您的提醒。事实证明你对 requestImageDataForAsset 工作是正确的。我将编辑原始代码块以反射(reflect)工作代码。您是否知道它在文档的哪个位置描述了 requestImageForAsset 返回的图像?
此外,您是否知道任何描述 requestImageDataForAsset 返回的数据的文档?我对图片的存储机制不太熟悉,但是requestImageData返回的数据在变成UIImage之前也和图片不完全匹配。
再次感谢!
StackOverflow 可爱的界面让输入键提交评论,然后给最多 5 分钟的时间进行编辑。那太好了。
最佳答案
requestImageForAsset 方法不保证您获得字节完美的输出。我建议您尝试 requestImageDataForAsset 方法,它应该会给出您期望的结果。
关于ios - 来自 PHImageManager 的图像数据不同于保存为 Assets 的图像数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35436842/
此代码首次正常运行。 PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc]init]; options.ver
我有以下代码用于检索图像并将其添加到数组中: //Set the size of the video to 1280x720 CGSize targetSize = CGSizeMak
关于使用 PHImageManager 获取 UIImage,我遇到了一个奇怪的问题。 当请求的 UIImage 不是从 iPhone 的照片应用程序编辑时,一切正常; [[PHImageManage
我正在尝试在 iOS 键盘扩展中访问用户相机胶卷中的最后一张照片。我已允许完全访问键盘并允许访问照片库。但是每次我尝试运行 PHImageManager.default().requestImage.
我让用户能够从他们的相机胶卷中挑选照片上传到服务器。 相机胶卷中的方向显示正确。 当我使用模拟器(iphone5、iphone6 等)时,一切都按预期工作,上传到服务器时照片的方向是正确的。 当我连接
这个问题在这里已经有了答案: How to get Original Image and media type from PHAsset? (3 个答案) 关闭 4 年前。 我有这个功能可以从 As
我使用下面的代码从 PHAsset 获取原始图像: PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] ini
我正在使用 Photos Framework根据用户定义的参数请求图像显示在 UIImageView 中。 我主要使用这段代码: var options = PHImageRequestOptions
我正在使用 Photos Framework 填充 UICollectionView。这应该是一个简单的模式,但我在取消对隐藏单元格的请求时遇到了问题。 这是我的代码,取自几个例子: #pragma
我正在尝试使用 PHAssetMediaTypeImage 获取所有用户 PHAsset,然后遍历它们,一次获取相应的 UIImages时间。我的 iPhone 5 上有大约 2k 张照片,此代码在迭
有人知道如何从 PHImageManager 获取平方拇指吗? PHImageContentModeAspectFill 选项无效。 [[PHImageManager defaultManager]
我正在制作一个使用 AVFoundation 拍照的应用程序,我想将它们保存到一个自定义相册中,然后我可以在我的应用程序中查询和显示该相册。 (我宁愿不要将它们放在一般的照片卷中,除非用户想要那样)我
这是我的代码,我的问题是我想在异步调用后等待结果。所以我尝试使用信号量,但是 dispatch_semaphore_signal 从未被调用,所以出现了死锁。我不知道如何解决这个问题。谁能告诉我发生了
当我尝试获取具有特定尺寸的图像时,PHImageManager.default().requestImage 被调用两次,并使用不同尺寸的图像。 代码如下: static func load(from
在 ios 13 PHImageManagerMaximumSize 上不起作用。 调用时 let manager = PHImageManager.default() let option = PH
对于某些视频,requestImageForAsset 以 nil 的 UIImage 完成。对于其他视频,它工作正常,我还没有弄清楚为什么。 func createThumbnailForVideo
我有一个 Collection View ,其中显示所有用户的照片。基本的东西,一个数据源,它获取 PHAssets 并在 PHCachingImageManager 上使用 requestImage
我正在使用 PHImageManager 来选择多个图像并这样写。问题是它是 block 并且顺序不正确(当用户选择照片 1、2、3 时,它可能返回 3、1、2)。我应该怎么写才能井井有条? PHIm
下面两种方法调整大小的结果有什么区别? 使用 UIImage: let horizontalRatio = newSize.width / size.width let verticalRatio =
我正在使用 objective-c 图像选择器图像选择器来选择时间流逝,但我正在快速进行。我只能访问 objective-c 代码,所以我使用了 objective-c 到 swift 转换器,但出现
我是一名优秀的程序员,十分优秀!