Ios iCloud上存储的图像中的CGImage看起来有误

Ios iCloud上存储的图像中的CGImage看起来有误,ios,uiimage,icloud,cgimage,Ios,Uiimage,Icloud,Cgimage,我使用中描述的代码从CGImage中提取像素颜色 然而,我刚刚意识到,如果我加载在另一台设备上创建的图像,像素值看起来是错误的。第一个明显的问题是阿尔法消失了。CGImageAlphaInfo报告了.noneSkipLast,但我知道图像是RGBA。如果我从创建它的同一台设备上读取,它看起来很好。第二个问题是有一些颜色溢出,好像图像已经调整了大小。也许是被压缩了或者什么的 下面是一个例子: 源图像是这个西瓜,12x12 它是在我的iPad上创建的。但如果我使用我链接的代码通过iCloud将其加

我使用中描述的代码从
CGImage
中提取像素颜色

然而,我刚刚意识到,如果我加载在另一台设备上创建的图像,像素值看起来是错误的。第一个明显的问题是阿尔法消失了。
CGImageAlphaInfo
报告了
.noneSkipLast
,但我知道图像是RGBA。如果我从创建它的同一台设备上读取,它看起来很好。第二个问题是有一些颜色溢出,好像图像已经调整了大小。也许是被压缩了或者什么的

下面是一个例子:

源图像是这个西瓜,
12x12

它是在我的iPad上创建的。但如果我使用我链接的代码通过iCloud将其加载到iPhone上,我会得到以下结果:

alpha通道消失,颜色流血

如果我从同一部iPhone使用Airdrop将小西瓜发送到我的Mac电脑,然后再次使用Airdrop将其发送回来(因此它应该是相同的图像!),然后立即加载,我会得到正确的图像:

(深棕色区域是alpha为0的区域)

如果您有一对iCloud已启用的iOS设备,您可以在此应用程序中重现此行为: 我用那个代码来读取像素颜色

这些图像之间有什么区别?如何从iCloud读取正确的图像?我应该在
UIImage
而不是
CGImage
中查找提示吗

有什么线索吗?谢谢

更新

作为参考,我正在使用
UIImagePickerController
读取图像,使用以下代码:

func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){
如果让image=info[UIImagePickerController.InfoKey.originalImage]作为?UIImage{
loadImageInMemory(图像)
}
picker.disclose(动画:true,完成:nil)
self.presentingViewController?退出(动画:true,完成:nil)
}
fileprivate func loadImageInMemory(image:UIImage){
///跳过一些准备工作
guard let cgImage=image.cgImage else{
返回
}
///getImageData是一个类似上面链接的getPixelColor的函数,
///但是为了一个直肠
self.imageData=cgImage.getImageData(矩形、宽度、高度)
}
我还发现了一个可能相关的问题:


正如Rob在下面的评论中所建议的,我将手机中的照片设置更改为“下载并保留原件”(而不是“优化iPhone存储”),这就解决了问题。所以我想问题是为什么iCloud试图压缩一个只有1355字节的PNG图像,以及是否可以从设置应用程序中的
UIImagePickerController

访问原始图像,在“照片”下有“优化iPhone存储”和“下载并保留原始图像”选项。后者应同步照片库,而不以任何方式更改图像

不过,空投似乎可以访问原始图像

Airdrop不依赖照片库iCloud同步发送图像。这就是为什么资产会毫无变化地跨越

我如何让我的应用程序也访问原始版本

这取决于您是否真的想使用照片库来同步您的资产。这似乎尤其正确,因为许多人可能根本不会选择将他们庞大的照片库同步到iCloud。我不确定你是否愿意相信这一点


您可能只想自己使用CloudKit,而不是依赖照片库。也许你应该在应用程序中设置一个选项,以便用户可以选择使用iCloud存储,如果是这样,则在你的应用程序中使用iCloud存储,而不是依赖照片库。

图像看起来模糊且没有alpha的原因似乎是默认情况下,照片从iCloud传输Jpeg压缩图像。即使您的原始图像在没有压缩的情况下会变小,就像在这个像素艺术示例中一样

正如所指出的,验证这种情况的一种方法是更改照片设置。从设置应用程序:

Settings -> Photos -> Download and Keep Originals
这可以解决问题,但当然不可取。如果您想继续使用照片,而不是实施自己的iCloud解决方案,同时保持
优化iPhone存储
设置,您可以使用来检索原始图像

替换此代码

func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){
如果让image=info[UIImagePickerController.InfoKey.originalImage]作为?UIImage{
loadImageInMemory(图像)
}
picker.disclose(动画:true,完成:nil)
self.presentingViewController?退出(动画:true,完成:nil)
}
根据其他代码:

导入照片
// ...
func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){
//它将异步加载
loadImageFromPicker(信息:信息)
picker.disclose(动画:true,完成:nil)
self.presentingViewController?退出(动画:true,完成:nil)
}
private func loadImageFromPicker(信息:[UIImagePickerController.InfoKey:Any]){
var相集:相集?
如果可用(iOS 11.0,*){
phAsset=info[UIImagePickerController.InfoKey.phAsset]作为?phAsset
}否则{
//对早期版本的回退
如果让referenceURL=info[UIImagePickerController.InfoKey.referenceURL]作为?URL{
让fetchResult=PHAsset.fetchAssets(带有alasseturls:[referenceURL],选项:nil)
phAsset=fetchResult.firstObject
}
}
保护let资产=相位设置其他{