Как получить необработанные данные изображения CR2 с помощью LibRaw(C++)

LibRaw - это библиотека для чтения файлов RAW с цифровых фотокамер (CRW/CR2, NEF, RAF, DNG, MOS, KDC, DCR и т. Д.; поддерживается практически все форматы RAW). Я хочу знать, как использовать LibRaw для получения необработанных данных изображения Canon CR2.

typedef struct
{
  ushort                      (*image)[4] ;
  libraw_image_sizes_t        sizes;
  libraw_iparams_t            idata;
  libraw_lensinfo_t           lens;
  libraw_makernotes_t         makernotes;
  libraw_shootinginfo_t       shootinginfo;
  libraw_output_params_t      params;
  unsigned int                progress_flags;
  unsigned int                process_warnings;
  libraw_colordata_t          color;
  libraw_imgother_t           other;
  libraw_thumbnail_t          thumbnail;
  libraw_rawdata_t            rawdata;
  void                *parent_class;
} libraw_data_t;
typedef struct
{
  void          *raw_alloc;
  ushort        *raw_image;
  ushort        (*color4_image)[4] ;
  ushort        (*color3_image)[3];
  float         *float_image;
  float         (*float3_image)[3];
  float         (*float4_image)[4];
  short  (*ph1_cblack)[2];//
  short  (*ph1_rblack)[2];//
  libraw_iparams_t  iparams;//
  libraw_image_sizes_t sizes;//
  libraw_internal_output_params_t ioparams;//
  libraw_colordata_t color;//
} libraw_rawdata_t;

Это структура данных RAW, я не знаю, в какой структуре хранятся самые примитивные данные.

1 ответ

Я уже получил ответ, теперь скачайте его ниже, я надеюсь помочь тем, кто нуждается.

    int i,ret,verbose = 0,output_thumbs = 0;
    char outfn [1024],thumbfn [1024];

    //Create object
    LibRaw RawProcessor;
    putenv((char *)"TZ = UTC+8");
    //
#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 = 0; //
    OUT.no_auto_scale=1;//
    OUT.no_auto_bright=1;//
    OUT.output_bps=16;//16bit
    OUT.output_color=0;//RAW

    //openfile
    if((ret = RawProcessor.open_file(szFile))!= LIBRAW_SUCCESS)
    {
        fprintf(stderr,"Can not open%s:%s\n",szFile,libraw_strerror(ret));
        RawProcessor.recycle();
        return FALSE;
    }


    //RAW size
    int height=S.raw_height;
    int width=S.raw_width;




    //image info
    memset(LinsnData.imgdata.make,0,64*sizeof(char));
    memset(LinsnData.imgdata.model,0,64*sizeof(char));
    memcpy(LinsnData.imgdata.make,P1.make,strlen(P1.make));
    memcpy(LinsnData.imgdata.model,P1.model,strlen(P1.model));
    LinsnData.imgdata.aperture=P2.aperture;
    LinsnData.imgdata.iso_speed=P2.iso_speed;
    LinsnData.imgdata.shutter=P2.shutter;
    char timestamp[64]= {0};
    tm* local = localtime(&P2.timestamp); //
    strftime(LinsnData.imgdata.timestamp, 64, "%Y-%m-%d %H:%M:%S", local);
    /***************************************************************************************************/
    //
    if((ret = RawProcessor.unpack())!= LIBRAW_SUCCESS)
    {
        fprintf(stderr,"Can not unpack_thumb%s:%s\n",szFile,libraw_strerror(ret));
        //if(LIBRAW_FATAL_ERROR(ret))
        goto end;
    }

    WORD *bmpData=RawProcessor.imgdata.rawdata.raw_image;

    int nWidth  = width/2;
    int nHeight = height/2;
    WORD *m_bmpDataR = new WORD[nWidth*nHeight];
    WORD *m_bmpDataG = new WORD[nWidth*nHeight]; 
    WORD *m_bmpDataB = new WORD[nWidth*nHeight];

    //
    for(int i=0;i<nHeight;i++)     
    {
        for(int j=0;j<nWidth;j++)
        {                                                                                                   
            m_bmpDataB[i*nWidth+j]  = bmpData[i*nWidth*4+nWidth*2+j*2+1];                                   
            m_bmpDataG[i*nWidth+j]  = ((bmpData[i*nWidth*4+nWidth*2+j*2]+bmpData[i*nWidth*4+j*2+1])>>1);    
            m_bmpDataR[i*nWidth+j]  = bmpData[i*nWidth*4+j*2];                                              
        }
    }
Другие вопросы по тегам