方案:
我在iPhone相机胶卷中有一个图像。我使用ALAssetLibrary
访问它并获取ALAsset
个对象。我使用类似下面的代码从中获取UIImage
和NSData
对象。
ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref)
{
UIImage *largeimage = [UIImage imageWithCGImage:iref ];
NSData * data = UIImageJPEGRepresentation(largeimage, 1.0f);
}
然后我使用Image Capture将图像从相机胶卷复制到我的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
有不同的纵坐标系统)。
答案 0 :(得分:3)
我最终找到了一种方法来做我想做的事。 ALAssetRepresentation
类的getBytes:fromOffset:length:error:
方法可用于获取OS X中与NSData
相同的[NSData dataWithContentsOfURL:fileURL]
对象。请注意,从UIImage执行此操作是不可能的,因为UIImage对图像执行一些处理。以下是所请求的函数的样子。
//In iOS
-(NSData *) getDataFromALAsset:(ALAsset*)asset {
ALAssetRepresentation *rep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(rep.size);
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
NSData *assetData = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
return assetData;
}
//In OS X
-(NSData *) getDataFromFileAtURL:(NSURL*)url
{
return [NSData dataWithContentsOfURL:url];
}