NSImage и UIImage дают разные представления NSData

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

Что я пробовал:

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

1 ответ

Решение

В конце концов я нашел способ сделать то, что хотел. 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];
}
Другие вопросы по тегам