Во время работы над процедурой открытия файлов TIFF, созданной с помощью программного обеспечения для микроскопа в Matlab, я застрял при чтении сжатых изображений.На данный момент для меня большая честь понять, как декодировать данные TIFF в формате PackBits.
Имея небольшой опыт в реальной информатике, у меня возникают проблемы с пониманием руководящих принципов в документации TIFF, а именно:
В обратной процедуре лучше всего кодировать 2-повтор байтового запуска как повторный запуск, за исключением случаев, когда перед ним идет и после него идет буквальный запуск.В этом случае лучше всего объединить три цикла в один буквальный цикл.Всегда кодируйте 3-байтовые повторы как повторы.Это суть алгоритма.Вот некоторые дополнительные правила:
• Упакуйте каждый ряд отдельно.Не сжимать через границы строк.
• Количество несжатых байтов в строке определяется как (ImageWidth + 7) / 8. Если требуется, чтобы несжатый битовый массив имел четное количество байтов в строке, распакуйте его.в выровненные слова буфера.
• Если длина цикла превышает 128 байтов, закодируйте оставшуюся часть цикла как один или несколько дополнительных повторяющихся циклов.
источник: https://www.fileformat.info/format/tiff/corion-packbits.htm
Я понимаю, как реализовать псевдокод и декодировать образец строки, сжатой с помощью PackBits в Matlab.Тем не менее, я потерялся при разборе 16-битного файла Tiff в оттенках серого.Мой вопрос: как мне это сделать?Я не совсем понимаю, что это означает в репликации , а также что такое буфер с выравниванием по словам .Когда я начинаю декодировать форму данных с первого байта, я просто получаю ерунду.
Будет полезна помощь в понимании логики декомпрессии, также будет полезна ссылка на распаковку кода Tiff PackBits.
~ Jakub
Edit : Я получил алгоритм распаковки для работы, моя ошибка заключалась в неправильной интерпретации байтов, вот код, если кто-то заинтересуется подобной проблемой в будущем.
Tiff_file = 'compressed.tiff';
%open and read tiff file file
imInfo = imfinfo(Tiff_file);
fId = fopen(Tiff_file);
im = fread(fId);
fclose(fId);
%parse the file
output = zeros(1,imInfo.Width * imInfo.Height * 2);%preallocate
thisLoc = 1;
for strip = 1:length(imInfo.StripOffsets)
thisLength = imInfo.StripByteCounts(strip);
thisOffset = imInfo.StripOffsets(strip);
thisStrip = im(thisOffset + 1 : thisOffset + thisLength);
pntr = 1; %start at the first byte
%loop throught the coded data
while pntr < thisLength
key = thisStrip(pntr);
if key >= 129
key = 257 - key;
datTmp = repmat(thisStrip(pntr+1), [1 key]);
output(thisLoc:thisLoc+key-1) = datTmp;
thisLoc = thisLoc+key;
pntr = pntr + 2;
elseif key == 128 %nope
pntr = pntr + 1;
else
datTmp = thisStrip(pntr + 1 : pntr + 1 + key);
output(thisLoc:thisLoc+key) = datTmp;
thisLoc = thisLoc + key+1;
pntr = pntr + key + 2;
end
end
end
im = typecast(uint8(output),'uint16');
%reshape decoded data.
im = reshape(im,[imInfo.Width imInfo.Height])';