Аномалия размера изображения

У меня есть изображение в виде NSURL в качестве входных данных. Я преобразовал этот URL-адрес в NSImage, а затем в NSData, из которого я мог получить CGImageRef. Этот imageRef помог мне извлечь необработанные данные из изображения, такие как высота, ширина, bytesPerRow и т. д.

Вот код, который я использовал:

NSString * urlName = [url path];
NSImage *image = [[NSImage alloc] initWithContentsOfFile:urlName];
NSData *imageData = [image TIFFRepresentation];
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)CFBridgingRetain(imageData), NULL);
CGImageRef imageRef =  CGImageSourceCreateImageAtIndex(source, 0, NULL);
NSUInteger numberOfBitsPerPixel = CGImageGetBitsPerPixel(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
...
...

Теперь я проверил размер изображения, используя:

int sz = [imageData length];

что отличается от - int sz' = bytesPerRow * height

Я не могу понять, почему такая разница. И sz на самом деле половина sz'.

Я делаю какую-то ошибку при извлечении различной информации? Из того, что я могу понять, возможно, при преобразовании изображения в NSData выполняются некоторые декомпрессии. В таком случае, что я должен использовать, чтобы получить надежные данные.

Я новичок в обработке изображений мира в Objective-C, поэтому, пожалуйста, потерпите меня!

P.S. На самом деле я проверил размер файла, который я получаю в качестве входных данных в виде NSURL, который совпадает с sz.


person Sankalp    schedule 01.10.2013    source источник


Ответы (1)


Попробуй это:

Вместо

NSData *imageData = [image TIFFRepresentation];

использовать это:

NSData *imageData = [image TIFFRepresentationUsingCompression:NSTIFFCompressionLZW factor:0];
person PR Singh    schedule 03.10.2013
comment
Будет ли это распаковывать .tiff, который у меня есть в качестве входных данных, поскольку проблема, которую я определил, заключается в том, что входное изображение уже сжато, поэтому размер изображения становится меньше? - person Sankalp; 03.10.2013
comment
Я попытался использовать этот вызов метода для NSImage, но это также поддерживает сжатый размер. - person Sankalp; 03.10.2013
comment
вы хотите заархивировать NSImage в NSData после этого наоборот, верно? - person PR Singh; 03.10.2013
comment
Верно. Я беру размер NSData как: int sz = [imageData length];, который составляет 330 КБ. Но на самом деле это должно быть 1044 * 580 = 605KB (при распаковке). Я думаю, что для этой цели требуется NSData, если у вас есть какой-либо другой метод, дайте мне знать. Кроме того, основное внимание здесь уделяется тому, как распаковать изображение, чтобы я мог получить фактические данные в виде NSData. - person Sankalp; 03.10.2013
comment
когда мы конвертируем NSImage в NSData, изображение будет сжиматься, после этого при разархивировании изображения (преобразование из NSData в NSImage) будет получено то же изображение, если вам нужен весь фрагмент кода, который я могу вам предоставить, попробуйте этот, если он вас удовлетворит, вы можете использовать. - person PR Singh; 03.10.2013
comment
Нет, проблема не в том, что изображение сжимается при преобразовании из NSImage в NSData; на самом деле это так - изображение, которое у меня есть на входе в виде NSURL, уже находится в сжатом виде (в данном случае .tiff). Итак, чтобы извлечь реальную информацию, это изображение необходимо распаковать. Не могли бы вы помочь мне с этой проблемой? - person Sankalp; 03.10.2013
comment
Вы хотите преобразовать изображение .tiff в любой другой формат, например png, jpeg и т. д.? - person PR Singh; 03.10.2013
comment
Нет. То, что я должен сделать, требует распаковки данных из входного изображения, так как я должен воспроизвести их где-то еще. - person Sankalp; 03.10.2013