3

场景:我在 iPhone 相机胶卷中有一张图像。我使用它访问它ALAssetLibrary并获取一个ALAsset对象。我使用类似下面的代码从中得到一个UIImageNSData对象。

ALAssetRepresentation *rep = [myasset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref)
{
    UIImage *largeimage = [UIImage imageWithCGImage:iref ];
    NSData * data = UIImageJPEGRepresentation(largeimage, 1.0f);
}

然后,我使用 Image Capture 将相机胶卷中的图像复制到我的 Mac 上。然后NSImage我在我的 Mac 代码中使用打开复制的图像并尝试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* 表示是完全相同的,因为它们来自同一个源图像。

我试过的:

我已经尝试过如何从对象中获取 UIImage 对象ALAsset,我尝试过(以及在 OS XUIImagePNGRepresentation中获取的相应对象)。NSData我还尝试使用不同的参数来获取 OS X 中的表示,但没有任何结果。我还尝试CGIImageRef在两个平台上创建一个,将其转换为位图并逐个像素地读取它们,甚至那些似乎已关闭(是的,我确实意识到它们NSBitmapImageRep具有不同的坐标系)。

4

1 回答 1

3

我最终确实找到了一种方法来做我想做的事。该类ALAssetRepresentationgetBytes:fromOffset:length:error:方法可用于获取与OS XNSData中相同的对象[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];
}
于 2013-12-13T14:26:18.303 回答