NSImage和UIImage提供不同的NSData表示

时间:2013-12-13 06:49:16

标签: ios objective-c uiimage nsimage nsimagerep

方案: 我在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的相应对象)。我还尝试使用不同的参数来获取OS X中的表示,但没有任何结果。我还尝试在两个平台上创建一个CGIImageRef,将其转换为Bitmaps并逐个像素地读取它们,甚至那些看起来都是关闭的(是的,我确实认识到NSBitmapImageRep有不同的纵坐标系统)。

1 个答案:

答案 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];
}