Не заради спора, но найди историю ещё раз Господин Маргулис делал подобную заяву, но она имела вполне конкретный смысл и относилась к довольно узкой области с довольно специфическим способом оценки.
Сам снимаю в cRAW, но тема заинтересовала. Спорить не хочу, но хочу сказать о паре вещей, которые сам знал/заметил: сразу скажу свой предварительный вывод: cRAW это 12 битный RAW пожатый алгоритмов "а-ля JPEG", только 12-битным. А остальная инфа такая: RAW содержит линейные значения яркостей, от 0 до 2^12 -1 (4095). Математически они представляются не как диапазон ( 0; 4095), а как ВНИМАНИЕ! диапазон вещественных чисел ( 0; 1). Алгоритмом sRGB этот диапазон (0, 1) переводится по специальной формуле (с учётом гаммы, в том числе) в выходной диапазон - тоже (0; 1). Для JPEGа или 8-битного TIFF'а 0 означает 0, а 1 - 255. Далее, ещё интереснее. Что такое 16-битный TIFF. Оказвается, это не линейная якрость, а та же sRGB (например). И значение 16 бит в ней трактуется как 8 бит до запятой и 8 бит после запятой, а старшие 8 бит - есть те самый (0, 255), что и в джпеге. Это я выяснил теоретически и проверил практически. То, что вытягивалось из 12-битного RAWа (кстати, я использовал cRAW) - и не вытягивалось из 8-битного JPEGа, также не вытягивалось и из 16-битного TIFFа. Далее. Только что провёл эксперимент по ужиманию RARом RAW и cRAW с макс. качеством: исходник RAW - 18548 KB; RAR - 11345 KB. исходник cRAW - 12536 KB; RAR - 11452 KB. Всё похоже на правду, пожатый а-ля джпег (как я предполагаю), cRAW сжался хуже, чем непожатый RAW. А размеры разные у RAW могут быть из-за того, что у них внутри превьюхи, и тоже пожаты JPEGом.
выдрал кусочек из dcraw'a в тему чтения RAW файлов. не очень понятно как работает, компилера под рукой нет поэкспериментировать. но на декомпресс JPEG'а не похоже. скорее похоже как раз на то о чем выше писали. т.е. комбинирование четырех байт сырца в три сжатых. ну что то типа 12+12+12+12=16+16+16. в итоге файл получается на 25% меньше. но только предположение конечно, исходник до конца не ясен может здесь кто разберется... --- cut on --- void CLASS sony_decrypt (unsigned *data, int len, int start, int key) { static unsigned pad[128], p; if (start) { for (p=0; p < 4; p++) pad[p] = key = key * 48828125 + 1; pad[3] = pad[3] << 1 | (pad[0]^pad[2]) >> 31; for (p=4; p < 127; p++) pad[p] = (pad[p-4]^pad[p-2]) << 1 | (pad[p-3]^pad[p-1]) >> 31; for (p=0; p < 127; p++) pad[p] = htonl(pad[p]); } while (len--) *data++ ^= pad[p++ & 127] = pad[(p+1) & 127] ^ pad[(p+65) & 127]; } void CLASS sony_load_raw() { uchar head[40]; ushort *pixel; unsigned i, key, row, col; fseek (ifp, 200896, SEEK_SET); fseek (ifp, (unsigned) fgetc(ifp)*4 - 1, SEEK_CUR); order = 0x4d4d; key = get4(); fseek (ifp, 164600, SEEK_SET); fread (head, 1, 40, ifp); sony_decrypt ((unsigned int *) head, 10, 1, key); for (i=26; i-- > 22; ) key = key << 8 | head; fseek (ifp, data_offset, SEEK_SET); pixel = (ushort *) calloc (raw_width, sizeof *pixel); merror (pixel, "sony_load_raw()"); for (row=0; row < height; row++) { if (fread (pixel, 2, raw_width, ifp) < raw_width) derror(); sony_decrypt ((unsigned int *) pixel, raw_width/2, !row, key); for (col=9; col < left_margin; col++) black += ntohs(pixel); for (col=0; col < width; col++) if ((BAYER(row,col) = ntohs(pixel[col+left_margin])) >> 14) derror(); } free (pixel); if (left_margin > 9) black /= (left_margin-9) * height; maximum = 0x3ff0; } --- cut off ---
то, что 12 бит складируется в непожатом RAW не в 16 бит, а "как надо, погдряд" - и так понятно исходя из размера файлов: 12МП было бы 24МБ, а есть - 18 МБ. upd. в представленной выборке из dcraw вообще нет того, что мы все ищем - там загрузка и расшифрование данных.
да вроде там ничего больше специфичного по камерам нет. дальше уже вроде обработка идет общая по всем камерам.
оффтоп. Проглядывал я давно этот код, Дэйв Коффин, при всём уважении к его труду - приводит пример, как не надо писать код...
стиль кода это не важно, программа AS IS вроде , хотя мне понравился в общем то. да по теме. крутил вертел в фотошопе 2 подобных файла один без другой с компрессией. разница есть по цвету и заметная. особенно в зеленом канале.
Разница между RAW и cRAW - последний сжат посредством "архиватора", но это не значит, что просто отбрасывание лишняя разрядность, сжатие информации осуществляется за счет устранения избыточности различными методами, например путем исключения повторяющихся битов и заменой их кодом, указывающим на кратность повторения, т.е. мы не теряем информацию, теряется лишь скорость обработки файла ... вопросы о изменения цвета, яркости и т.д. - скорее программный баг ...
Потерять можно максимум 4 бита из 12. Монитор показывате 8 бит. Эксперименты по компресси выкладывались на dpreview. Все, что вы написали никаким образом не относится к cRaw. Компрессия у sony своя. Хранятся 11 битное максимальное значеие, 11 битное минимальное значение и 2 битная разници от одного из них. cRaw - алгоритм компрессии с потерями.
Т.к. камера у меня с cRAW появилась недавно, почему разговор идет о сжатии с потерями? На сколько можно судить, то алгоритмы компрессии на ходу без потерь давно применимы как и в сетях передачи данных, так и далее.. преславутая LZW компрессия на аппаратном уровне для растра как раз даст такие резульаты, или так все плохо?
Потому, что sony выбрала такой алгоритм. LZW для изображений, а для камерных raw особенно, не эффективен из за шума.