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