NSImage和UIImage提供不同的NSData表示



场景:我在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上。然后,我在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的对应对象)。我也尝试过使用不同的参数来获得OSX中的表示,但没有成功。我还尝试在这两个平台上创建一个CGIImageRef,将其转换为位图并逐像素读取,甚至那些似乎都关闭了(是的,我确实意识到NSBitmapImageRep有不同的坐标系)。

我最终找到了做我想做的事的方法。ALAssetRepresentation类的getBytes:fromOffset:length:error:方法可用于获取与OS X中的[NSData dataWithContentsOfURL:fileURL]相同的NSData对象。请注意,由于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];
}

最新更新