1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>LibRaw: примеры использования</title>
</head>
<body>
<a href=index-rus.html>[вернуться к оглавлению]</a>
<h1>LibRaw: примеры использования</h1>
<h2>Обзор примеров в дистрибутиве (samples/*)</h2>
<p>В поставку LibRaw включено несколько примеров использования библиотеки, их исходные тексты расположены в
каталоге samples/, после сборки они оказываются в каталоге bin/:</p>
<ul>
<li><b>raw-identify</b> Из вызовов LibRaw используется только <a
href="API-CXX-rus.html#open_file">open_file()</a>, далее идет код, печатающий значения полей структуры
imgdata. Выдача <b>raw-identify</b>/<b>raw-identify -v</b> практически полностью копирует выдачу <b>dcraw
-i</b>/<b>dcraw -i -v </b> (в выдаче примера дополнительно печатаются источники цветовых данных и легенда к
ним).
<p>
Дополнительные параметры, отсутствующие у dcraw: <b>-u</b> - печатать имя функции - распаковщика данных;
<b>-u -f</b> - печатать имя распаковщика и размер черной (маскированной) рамки.
</p>
</li>
<li><b>simple_dcraw</b> Простой "эмулятор" dcraw, воспроизводящий поведение <b>dcraw [-D] [-e] [-v]
[-T]</b>. Результат работы должен бинарно совпадать с результатами работы dcraw запущенной с нужными
ключами. Упрощенный вариант этого примера <a href="#code">рассмотрен ниже</a>.<br/>
Ключ <b>-B</b> включает использование <a href="API-CXX-rus.html#open_buffer">интерфейса open_buffer()</a>
куда передается mmap()-ed файл (Unix only).
</li>
<li><b>dcraw_half</b> Демонстрация использования <a href="API-C-rus.html">C API</a>. Пример эмулирует поведение
<b>dcraw -h</b> (какие-то еще управляющие параметры этому примеру задать нельзя). Результат работы должен
бинарно совпадать с результатами работы <b>dcraw -h</b>.
</li>
<li><b>dcraw_emu</b> Полный эмулятор dcraw (за исключением ключей -D -d -P -K -i -e, которые обрабатываются в
других примерах использования). Основной интерес представляет обработка ключей командной строки (скопированная
из dcraw). Результат работы должен бинарно совпадать с результатом работы dcraw с теми же ключами командной
строки.
<p>
Этот пример поддерживает дополнительные ключи, отсутствующие в оригинальной dcraw:
</p>
<dl>
<dt><b>-mmap</b></dt>
<dd>
Включает использование <a href="API-CXX-rus.html#open_buffer">интерфейса open_buffer()</a>
куда передается mmap()-ed файл (Unix only).
</dd>
<dt><b>-mem</b></dt>
<dd>
Входной файл читается в буфер в памяти и раскодируется оттуда.
</dd>
<dt><b>-c значение в диапазоне 0-1</b></dt>
<dd>
Ключ меняет значение параметра <strong>params.adjust_maximum_thr</strong>.
Для отключения автоматического вычисления максимума, поставьте этот параметр в 0.0.
<br/>
Умолчание: 0.75
</dd>
<dt><b>-timing</b></dt>
<dd>
Включает тайминг отдельных этапов обработки.
</dd>
<dt><b>-G</b></dt>
<dd>
Включает green_matching: выравнивание каналов зеленого для тех камер, где эти каналы различаются.
</dd>
<dt><b>-B x y w h</b></dt>
<dd>
Включает обрезание (cropping) выходного изображения до прямоугольника с
верхним левым углом в x,y шириной w и высотой h. Координаты и размеры - до поворотов изображения (если
применяются повороты).
</dd>
<dt><b>-dcbi N</b></dt>
<dd>Устанавливает количество дополнительных итераций алгоритма DCB (только для -q 4).
Умолчание - 0 (нет дополнительных итераций)
</dd>
<dt><b>-dcbe</b></dt>
<dd>
Включает режим DCB color enhance (только для -q 4).
</dd>
<dt><b>-eeci</b></dt>
<dd>
Включает режим EECI refine (только для mixed VCD/AHD -q 8)
</dd>
<dt><b>-esmed N</b></dt>
<dd>
Количество проходов edge-sensitive median filter для интерполяции VCD+AHD
</dd>
<dt><b>-acae r b</b></dt>
<dd>
Включает режим подавления хроматической аберрации. Параметры r и b означают величину коррекции по красной
и синей осям. Эти параметры обязательны, для автоматической коррекции следует использовать
-acae 0 0
</dd>
<dt><b>-aline l</b></dt>
<dd>
Включает режим подавления полосатости (banding). l - степень подавления шума, диапазон значений
0.001-0.02, типичное значение 0.005
</dd>
<dt><b>-aclean l c</b></dt>
<dd>
Включает режим подавления импульсного шума. l - степень подавления яркостного (luminocity) шума,
c - цветового (chrominance) шума. Разумный диапазон значений обоих параметров 0.005-0.05, типовое - 0.01.
</dd>
<dt><b>-agreen g</b></dt>
<dd>
Включает режим выравнивания зеленых каналов на равномерных поверхностях. g - степень чувствительности
алгоритма, диапазон значений 0.01-0.1, типичное значение 0.03.
</dd>
<dt><b>-aexpo e p</b></dt>
<dd>
Включает экспокоррекцию (до демозаики). e - величина экспокоррекции (в линейной шкале), диапазон от 0.25
(-2 стопа) до 8 (+3 стопа). p - степень предохранения светов при положительной экспокоррекции, диапазон от
0.0 (просто линейный сдвиг данных с клиппингом) до 1.0 (полное отсутствие дополнительного клиппинга от
экспокоррекции).
</dd>
</dl>
</li>
<li><b>half_mt</b> Эмулятор <b>dcraw -h</b>, понимает ключи -a (автоматический баланс белого по всему
изображению), -w (баланс белого камеры), -T (выводить в tiff) и -J n - количество параллельных threads,
запускаемых для обработки изображений.<br/>
На мультипроцессорных/multicore машинах дает существенный выигрыш в скорости при массовой обработке.<br/>
На Win32-машине пример собирается из исходного файла half_mt_win32.c, причина в том, что работа с threads на
Windows принципиально другая и проще размножить простые исходники, чем написать один сложный.
</li>
<li><b>mem_image</b> Пример использования функций
<a href="API-CXX-rus.html#dcraw_make_mem_image">dcraw_make_mem_image</a> и
<a href="API-CXX-rus.html#dcraw_make_mem_thumb">dcraw_make_mem_thumb</a>: распаковка изображений и preview()
в память с последующей простой записью в форматах PPM (и JPEG для thumbnail). Результат работы должен быть
идентичен результатам работы dcraw с теми же ключами (поддерживаются ключи <b>-4, -1, -e, -h</b>).
</li>
<li><b>unprocessed_raw</b> - извлечение максимально неизмененных RAW-данных, без вычитания уровня черного
и маскирования черных пикселов (на тех камерах, где возможно маскирование). Для тех камер, которые выдают
в RAW-данные черную рамку (маскированные пикселы) - рамка включается в выдаваемые данные.
Ключи командной строки: <b>-q</b> - не выдавать текстовую справку о размерах файла, <b>-A</b> -
автомасштабирование данных в целое число раз, <b>-g</b> выдавать гамма-корректированные (2.2) данные, а не
линейные, <b>-N</b> - выключает наложение тоновой кривой на RAW-данные, <b>-B</b> включает вычитание уровня
черного из данных, <b>-M</b> добавляет маскированную рамку к результирующему изображению.
</li>
<li><b>4channnels</b> - сохраняет RAW-файл в виде 4 отдельных 16-битных grayscale TIFF-файлов (поканально).<br/>
Ключи командной строки:
<ul>
<li><b>-s N</b> выбрать N-е изображение (для файлов с несколькими изображениями)</li>
<li><b>-g</b> выводить гамма-корректированное (2.2) изображение</li>
<li><b>-A</b> автомасштабирование значений в целое число раз</li>
<li><b>-B</b> отключить вычитание уровня черного</li>
<li><b>-N</b> отключить тоновую кривую для RAW</li>
</ul>
</li>
<li><b>multirender_test</b> - простой пример, показывающий возможность множественной постобработки с
разными параметрами без переоткрытия файла.
</li>
</ul>
<h2>Пример simple_dcraw</h2>
<p>Ниже рассмотрен пример samples/simple_dcraw.cpp - эмулирующий поведение <b>dcraw [-D] [-e][-v][-t]</b>. Для
экономии места представим, что всегда заданы ключи -t -v (чтобы не комментировать разбор командной строки)
и что параметр (имя файла) всегда один и всегда передается.
</p>
<pre>
int main(int ac, char *av[])
{
int i, ret, verbose=0, output_thumbs=0;
char outfn[1024],thumbfn[1024];
// Создадим объект - обработчик изображений.
LibRaw RawProcessor;
// В TIFF пишется дата в локальном формате, для совместимости с dcraw поставим таймзону
putenv ((char*)"TZ=UTC");
// Определим переменные для удобного доступа к полям RawProcessor
#define P1 RawProcessor.imgdata.idata
#define S RawProcessor.imgdata.sizes
#define C RawProcessor.imgdata.color
#define T RawProcessor.imgdata.thumbnail
#define P2 RawProcessor.imgdata.other
#define OUT RawProcessor.imgdata.params
OUT.output_tiff = 1; // Выводить будем TIFF
// Откроем файл
if( (ret = RawProcessor.open_file(av[1])) != LIBRAW_SUCCESS)
{
fprintf(stderr,"Cannot open %s: %s\n",av[i],libraw_strerror(ret));
// recycle() нужен только если мы хотим освободить ресурсы прямо сейчас.
// Если мы обрабатываем файлы в цикле, то следующий open_file()
// тоже вызовет recycle. Если случилась фатальная ошибка, то recycle()
// уже вызван (вреда от повторного вызова тоже нет)
RawProcessor.recycle();
goto end;
}
// Распакуем изображение
if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS)
{
fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));
if(LIBRAW_FATAL_ERROR(ret))
goto end;
// для нефатальной ошибки - пробуем продолжить
}
// Распакуем thumbnail
if( (ret = RawProcessor.unpack_thumb() ) != LIBRAW_SUCCESS)
{
// обработка ошибки полностью аналогична предыдущему случаю
fprintf(stderr,"Cannot unpack_thumb %s: %s\n",av[i],libraw_strerror(ret));
if(LIBRAW_FATAL_ERROR(ret))
goto end;
}
else // Успешно распаковали thumbnail, запишем его в файл
{
snprintf(thumbfn,sizeof(thumbfn),"%s.%s",av[i],T.tformat == LIBRAW_THUMBNAIL_JPEG ? "thumb.jpg" : "thumb.ppm");
if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_thumb_writer(thumbfn)))
{
fprintf(stderr,"Cannot write %s: %s\n",thumbfn,libraw_strerror(ret));
// в случае фатальной ошибки мы должны заканчивать обработку текущего файла
if(LIBRAW_FATAL_ERROR(ret))
goto end;
}
}
// Распаковка данных
if(OUT.document_mode)
ret = RawProcessor.dcraw_document_mode_processing();
else
ret = RawProcessor.dcraw_process();
if(LIBRAW_SUCCESS != ret ) // ошибка на предыдущем шаге
{
fprintf(stderr,"Cannot do postprocessing on %s: %s\n",av[i],libraw_strerror(ret));
if(LIBRAW_FATAL_ERROR(ret))
goto end;
}
else // Успешная обработка документа
{
snprintf(outfn,sizeof(outfn),"%s.%s", av[i], "tiff");
if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn)))
fprintf(stderr,"Cannot write %s: error %d\n",outfn,ret);
}
// Не делаем recycle, не зовем деструктор, C++ все делает за нас.
return 0;
end:
// сюда попали после ошибки
return 1;
}
</pre>
<a href=index-rus.html>[вернуться к оглавлению]</a>
<hr>
<address><a href="mailto:info@libraw.org">LibRaw Team</a></address>
<!-- Created: Sun Mar 16 12:19:36 MSK 2008 -->
<!-- hhmts start -->
Last modified: Mon Jul 11 20:23:33 MSD 2011
<!-- hhmts end -->
</body>
</html>
|