场景: 我在iPhone相机卷中有一个图像。我使用ALAssetLibrary
访问它并获得ALAsset
对象。我使用类似下面的代码从它得到一个UIImage
和NSData
对象。NSImage和UIImage给出不同的NSData表示
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref)
{
UIImage *largeimage = [UIImage imageWithCGImage:iref ];
NSData * data = UIImageJPEGRepresentation(largeimage, 1.0f);
}
然后我使用图像捕捉功能将图像从相机胶卷复制到我的Mac上。然后,在我的Mac代码中使用NSImage
打开复制的图像,并尝试使用以下代码获取NSData
表示形式。
NSImage * image = [[NSImage alloc] initWithContentsOfURL:fileURL];
NSBitmapImageRep *imgRep = [[image representations] objectAtIndex: 0];
NSData *data = [imgRep representationUsingType: NSJPEGFileType properties: nil];
问题: 不幸的是,这两个NSData
表示我得到的是非常不同的。我希望能够在两种情况下获得相同的NSData
表示(因为它是相同的文件)。然后,我可以继续散列NSData
对象,并比较哈希得出的结论是这两个(可能)是相同的图像。理想情况下,我想要以下两个功能;
//In iOS
-(NSData *) getDataFromALAsset:(ALAsset*)asset;
//or
-(NSData *) getDataFromUIImage:(UIImage*)image;
//In OS X
-(NSData *) getDataFromFileAtURL:(NSURL*)url;
//or
-(NSData *) getDataFromNSImage:(NSImage*)image;
这样,我在OS X和iOS中获得的NSData *表示就完全一样,因为它们来自同一个源图像。
我曾尝试:
我试图玩弄我如何才能从ALAsset
对象的UIImage对象,我试图UIImagePNGRepresentation
(和在OS X中获得NSData
对应)。我也尝试过使用不同的参数来获取OS X中的表示,但没有任何结果。我也尝试在两个平台上创建一个CGIImageRef
,将其转换为Bitmaps并逐像素地读取它们,甚至看起来都是关闭的(并且是的,我确实意识到NSBitmapImageRep
有不同的坐标系)。
您正在对图像执行多次JPEG压缩,因此这些位不可避免地会发生变化。 – NSAdam
@NSAdam你能否提出一种避免这种情况的方法?解决实际问题的任何见解? – Tayyab
我也试图得到一个使用CGImageRef的NSData对象,但这也不起作用。 – Tayyab