LibRaw包中包含几个说明此库使用的示例。它们的源代码位于samples /文件夹中,在库构建之后,它们将位于bin /文件夹中:
此示例支持原始dcraw中不存在的其他命令行参数:
下面我们考虑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;
}