2013-12-13 5 views
3

Сценарий: У меня есть изображение в рулоне камеры для iPhone. Я обращаюсь к нему с помощью ALAssetLibrary и получаю объект ALAsset. Я получаю объект UIImage и NSData, используя что-то вроде следующего кода.NSImage и 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 to my 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; 

Такое представление о том, что NSData * Я получаю в OS X и прошивке точно так же, учитывая, что они исходят из того же исходного изображения.

То, что я пробовал:

Я пытался поиграть с тем, как я получаю объект UIImage из ALAsset объекта, я попытался UIImagePNGRepresentation (и соответствующий для получения NSData в OS X). Я также пытался играть с различными параметрами для получения представления в OS X, но ничего не получилось. Я также попытался создать на обеих платформах CGIImageRef, преобразовать их в растровые изображения и прочитать их по пикселям, и даже те, которые кажутся выключенными (и да, я понимаю, что NSBitmapImageRep имеет другую систему координат).

+2

Выполняется сжатие JPEG на изображении несколько раз, поэтому биты неизбежно будут меняться. – NSAdam

+0

@NSAdam вы можете предложить способ избежать этого? Любые идеи по решению актуальной проблемы? – Tayyab

+0

Я также попытался получить объект NSData с использованием CGImageRef, но это тоже не сработает. – Tayyab

ответ

3

В конце концов я нашел способ сделать то, что хотел. Метод ALAssetRepresentation класса getBytes:fromOffset:length:error: может использоваться для получения объекта NSData, который аналогичен [NSData dataWithContentsOfURL:fileURL] в OS X. Обратите внимание, что выполнение этого из 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]; 
}