【LibRaw】原始图像解码库介绍(十四)—— 使用示例

用法示例

分发包中的示例概述(样本/ *)

LibRaw包中包含几个说明此库使用的示例。它们的源代码位于samples /文件夹中,在库构建之后,它们将位于bin /文件夹中:

  • raw-identify它使用的唯一LibRaw调用是open_file() ; 进一步的代码打印imgdata结构的字段的值。的输出原始识别(无开关)几乎是相同的输出dcraw的-iraw-identify -v提供类似于dcraw -i -v的 数据,并且还会转储许多其他元数据。命令行键-u显示解包函数名称,而-u -f打印函数名称和屏蔽是大小。raw-identify -w将打印存储在RAW文件中的白平衡表。 


  • simple_dcraw一个简单的“模拟”dcraw再现dcraw [-D] [-e] [-v] [-T]的行为其工作结果必须与具有相关键的dcraw运行产生的结果二进制相同。下面考虑该示例的简化版本
    -B命令行开关打开使用通过输入文件的mmap()使用的open_buffer()API调用(仅限Unix)。
  • dcraw_half演示C API的使用该示例模拟dcraw -h的行为(在此示例中不能指定其他控制参数)。其工作结果必须与dcraw -h生成的结果二进制相同
  • dcraw_emu完成dcraw的模拟(除了键-D -d -P -K -i -e,在其他用法示例中考虑)。最感兴趣的是处理命令行键(从dcraw复制)。其工作结果必须与使用相同命令行键的dcraw生成的结果二进制相同。

    此示例支持原始dcraw中不存在的其他命令行参数:

    -mmap
    使用 open_buffer() 接口。缓冲区由mmap()调用编写。Win32下不支持此选项。
    -meme
    使用 open_buffer() 接口。缓冲区由malloc()+ read()调用。
    -c float-value
    此键设置 params.adjust_maximum_thr 参数。
    使用-c 0可完全禁用自动最大计算。
    默认值:0.75
    -timing
    打开详细的计时打印。
    -G
    打开“green_matching”模式以抑制具有不同绿色通道的摄像机上的色彩迷宫。
    -B xywh
    裁剪输出为矩形,宽度为w,高度为h,左上角为x,y坐标。在任何图像旋转之前应用所有坐标。
    -F
    将使用FILE I / O(bigfile_datastream)代替标准LibRaw_file_datastream。
    -dcbi N.
    设置附加DCB-demosaic迭代次数(选项仅对-q 4有效,即DCB去马赛克)。
    -dcbe
    打开DCB颜色增强模式(仅适用于DCB去马赛克,-q 4)。
    -eeci
    打开EECI精炼(仅适用于混合VCD / AHD -q 8)
    -esmed N.
    用于VCD + AHD去马赛克的边缘敏感中值滤波器的通过次数。
    -acae rb
    打开色差抑制。r和b参数分别是红轴和蓝轴校正量。对于自动校正,请使用 -acae 0 0
    -aline l
    打开条带抑制。l是校正量,可用范围为0.001至0.02,典型值为0.005。
    -aclean lc
    打开脉冲噪声抑制。l和c分别是光度和色度抑制值。两者的可用范围是0.005-0.05,典型值是0.01。
    - agreen g
    在均匀曲面上打开绿色通道均衡。g是算法灵敏度,可用范围0.01-0.1,典型值0.03。
    -aexpo ep
    打开曝光校正。e是线性刻度的曝光偏移从0.25(变暗2档)到8.0(减轻3档)。p是高亮保存量,从0.0(无保存,完全剪裁)到1.0(完全保存,高光中的S样曲线)。
    -apentax4shot
    将合并来自Pentax 4-shot RAW的4帧
    -apentax4shotorder abce
    pentax 4-shot文件中的帧顺序(默认为3102)
    -dbnd rgbg
    打开debanding代码
    -mmap
    使用mmap + memory IO而不是文件IO(仅限unix)
    -disars
    禁用RawSpeed库(如果使用此库编译)
    -disinterp
    不要运行插值步骤
    -dsrawrgb1
    禁用sRAW的YCbCr到RGB转换(启用Cb / Cr插值)
    -dsrawrgb2
    禁用sRAW的YCbCr到RGB转换(禁用Cb / Cr插值)
    -disadcf
    即使使用demosaic-pack-GPL2编译,也不要使用dcraw Foveon代码
  • half_mt模拟dcraw -h它“理解”以下键:-a(整个图像上的自动白平衡),-w(相机的白平衡),-T(以tiff格式输出)和-J n(启动的并行线程数)用于图像处理)。
    在多处理器/多核计算机上,速度增益在批量处理的情况下是显着的。在Win32机器上,该示例是从初始文件half_mt_win32.c汇编而来的,因为在Windows下使用线程基本上是不同的,并且复制简单的源代码比编写一个复杂的代码更容易。
  • mem_image此示例使用dcraw_make_mem_imagedcraw_make_mem_thumb调用,而不是以PPM格式写入数据。结果应与具有相同命令行选项的dcraw相同(支持选项:-4,-1,-e,-h)。
  • unprocessed_raw此示例提取(大部分)未改变的RAW数据,包括屏蔽像素数据(在支持的摄像机上)。如果存在黑框并且对于给定格式支持黑帧提取,则将屏蔽像素数据添加到所得到的.TIFF文件中。命令行选项:-q - 安静,-A - 自动缩放数据(整数乘数), - g伽马校正(伽玛2.2)数据(而不是精确的线性), - B打开黑电平减法
  • 4channnels - 将RAW文件分成四个独立的16位灰度TIFF(每个RAW通道)。
    命令行开关:
    • -s N从RAW中选择具有多个图像的第N个图像
    • -g gamma校正(gamma 2.2)
    • -A通过自动计算的整数因子自动调整值
    • -B关闭黑色减法
    • -N没有RAW曲线
  • multirender_test - 在不重新打开的情况下在一个文件上进行多次渲染的非常简单的示例。
  • postprocessing_benchmark - 将打印RAW处理步骤的时间

示例:

下面我们考虑samples / simple_dcraw.cpp示例,它模拟了dcraw [-D] [-e] [ - v] [ - t]的行为为了节省空间,让我们假设始终指定了键-t -v(以避免对命令行解析进行注释)并且始终存在一个参数(文件名),这是唯一一个并始终传递给程序的参数。

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+8”);
//让我们定义变量以方便访问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,“无法打开%s:%s \ n”,av [i],libraw_strerror(ret));
     //只有当我们想立即释放资源时才需要使用recycle()。
     //如果我们在一个循环中处理文件,那么下一个open_file()
     //也会调用recycle()。如果发生致命错误,则表示recycle()
     //已被调用(重复调用也不会造成任何伤害)。
     RawProcessor.recycle();
 }
 //让我们解压缩图像
 if((ret = RawProcessor.unpack())!= LIBRAW_SUCCESS)
 {
     fprintf(stderr,“不能unpack_thumb%s:%s \ n”,av [i],libraw_strerror(ret));
     if(LIBRAW_FATAL_ERROR(RET))
     goto end;
     //如果出现非致命错误,我们会尝试继续
 }
 //让我们解开缩略图
 if((ret = RawProcessor.unpack_thumb())!= LIBRAW_SUCCESS)
 {
     //错误处理与前一种情况完全相似
     fprintf(stderr,“不能unpack_thumb%s:%s \ n”,av [i],libraw_strerror(ret));
     if(LIBRAW_FATAL_ERROR(RET))
     goto end;
 }
 else //我们已成功解压缩缩略图,现在让我们将其写入文件
 {
     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,“不能写%s:%s \ n”,thumbfn,libraw_strerror(ret));
         //在致命错误的情况下,我们应该终止当前文件的处理
         if(LIBRAW_FATAL_ERROR(RET))
         goto end;
     }
 }
 //数据解包
 ret = RawProcessor.dcraw_process();
 if(LIBRAW_SUCCESS!= ret)//上一步的错误
 {
     fprintf(stderr,“不能对%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,“不能写%s:错误%d \ n”,outfn,ret);
 }
 //我们不会唤起recycle()或调用析构函数; C ++将为我们做一切
 return 0;
end:
 //出错后来到这里
 return 1;
}

猜你喜欢

转载自blog.csdn.net/Mr_sandman1994/article/details/80897622
今日推荐