2013-12-13 42 views
3

场景: 我在iPhone相机卷中有一个图像。我使用ALAssetLibrary访问它并获得ALAsset对象。我使用类似下面的代码从它得到一个UIImageNSData对象。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有不同的坐标系)。

+2

您正在对图像执行多次JPEG压缩,因此这些位不可避免地会发生变化。 – NSAdam

+0

@NSAdam你能否提出一种避免这种情况的方法?解决实际问题的任何见解? – Tayyab

+0

我也试图得到一个使用CGImageRef的NSData对象,但这也不起作用。 – Tayyab

回答

3

我终于找到了一种方法来做我想做的事。可以使用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]; 
}