int main(int ac, char *av[]) { int i, ret; int verbose=1,autoscale=0,use_gamma=0; char outfn[1024]; LibRaw RawProcessor; if(ac<2) { usage: printf( "unprocessed_raw - LibRaw %s sample. %d cameras supported\n" "Usage: %s [-q] [-A] [-g] [-s N] [-N] raw-files....\n" "\t-q - be quiet\n" "\t-s N - select Nth image in file (default=0)\n" "\t-g - use gamma correction with gamma 2.2 (not precise,use for visual inspection only)\n" "\t-A - autoscaling (by integer factor)\n" "\t-N - no raw curve\n" ,LibRaw::version(), LibRaw::cameraCount(), av[0]); return 0; } #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.document_mode=2; OUT.output_bps=16; OUT.output_tiff=1; OUT.user_flip=0; OUT.no_auto_bright = 1; OUT.filtering_mode=(LibRaw_filtering)( LIBRAW_FILTERING_NOBLACKS|LIBRAW_FILTERING_NOZEROES); for (i=1;i<ac;i++) { if(av[i][0]=='-') { if(av[i][1]=='q' && av[i][2]==0) verbose=0; else if(av[i][1]=='A' && av[i][2]==0) autoscale=1; else if(av[i][1]=='g' && av[i][2]==0) use_gamma = 1; else if(av[i][1]=='N' && av[i][2]==0) OUT.filtering_mode=LIBRAW_FILTERING_NONE; else if(av[i][1]=='s' && av[i][2]==0) { i++; OUT.shot_select=atoi(av[i]); } else goto usage; continue; } int c; if(!use_gamma) OUT.gamm[0] = OUT.gamm[1] = 1; if(verbose) printf("Processing file %s\n",av[i]); if( (ret = RawProcessor.open_file(av[i])) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot open %s: %s\n",av[i],libraw_strerror(ret)); continue; // no recycle b/c open file will recycle itself } if(verbose) { printf("Image size: %dx%d\nRaw size: %dx%d\n",S.width,S.height,S.raw_width,S.raw_height); printf("Margins: top=%d, left=%d, right=%d, bottom=%d\n", S.top_margin,S.left_margin,S.right_margin,S.bottom_margin); } if( (ret = RawProcessor.unpack() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot unpack %s: %s\n",av[i],libraw_strerror(ret)); continue; } if(verbose) printf("Unpacked....\n"); if( (ret = RawProcessor.add_masked_borders_to_bitmap() ) != LIBRAW_SUCCESS) { fprintf(stderr,"Cannot add mask data to bitmap %s\n",av[i]); } // move all pixel data to component 0 for(int r=0;r<S.iheight;r++) for(c=0;c<S.iwidth;c++) RawProcessor.imgdata.image[r*S.iwidth+c][0] = RawProcessor.imgdata.image[r*S.iwidth+c][RawProcessor.COLOR(r,c)]; P1.colors=1; if(autoscale) { unsigned max=0,scale; for(int j=0; j<S.iheight*S.iwidth; j++) if(max < RawProcessor.imgdata.image[j][0]) max = RawProcessor.imgdata.image[j][0]; if (max >0 && max< 1<<15) { scale = (1<<16)/max; if(verbose) printf("Scaling with multiplier=%d (max=%d)\n",scale,max); for(int j=0; j<S.iheight*S.iwidth; j++) RawProcessor.imgdata.image[j][0] *= scale; } } if(OUT.shot_select) snprintf(outfn,sizeof(outfn),"%s-%d.tiff",av[i],OUT.shot_select); else snprintf(outfn,sizeof(outfn),"%s.tiff",av[i]); if(verbose) printf("Writing file %s\n",outfn); if( LIBRAW_SUCCESS != (ret = RawProcessor.dcraw_ppm_tiff_writer(outfn))) fprintf(stderr,"Cannot write %s: %s\n",outfn,libraw_strerror(ret)); } return 0; }
bool KDcraw::extractRAWData(const QString& filePath, QByteArray& rawData, DcrawInfoContainer& identify, unsigned int shotSelect) { QFileInfo fileInfo(filePath); QString rawFilesExt(rawFiles()); QString ext = fileInfo.suffix().toUpper(); identify.isDecodable = false; if (!fileInfo.exists() || ext.isEmpty() || !rawFilesExt.toUpper().contains(ext)) return false; if (m_cancel) return false; d->setProgress(0.1); LibRaw raw; // Set progress call back function. raw.set_progress_handler(callbackForLibRaw, d); int ret = raw.open_file((const char*)(QFile::encodeName(filePath)).constData()); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run open_file: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.3); raw.imgdata.params.output_bps = 16; raw.imgdata.params.shot_select = shotSelect; ret = raw.unpack(); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run unpack: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.4); ret = raw.raw2image(); if (ret != LIBRAW_SUCCESS) { qCDebug(LIBKDCRAW_LOG) << "LibRaw: failed to run raw2image: " << libraw_strerror(ret); raw.recycle(); return false; } if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.6); Private::fillIndentifyInfo(&raw, identify); if (m_cancel) { raw.recycle(); return false; } d->setProgress(0.8); rawData = QByteArray(); if (raw.imgdata.idata.filters == 0) { rawData.resize((int)(raw.imgdata.sizes.iwidth * raw.imgdata.sizes.iheight * raw.imgdata.idata.colors * sizeof(unsigned short))); unsigned short* output = reinterpret_cast<unsigned short*>(rawData.data()); for (unsigned int row = 0; row < raw.imgdata.sizes.iheight; row++) { for (unsigned int col = 0; col < raw.imgdata.sizes.iwidth; col++) { for (int color = 0; color < raw.imgdata.idata.colors; color++) { *output = raw.imgdata.image[raw.imgdata.sizes.iwidth*row + col][color]; output++; } } } } else { rawData.resize((int)(raw.imgdata.sizes.iwidth * raw.imgdata.sizes.iheight * sizeof(unsigned short))); unsigned short* output = reinterpret_cast<unsigned short*>(rawData.data()); for (uint row = 0; row < raw.imgdata.sizes.iheight; row++) { for (uint col = 0; col < raw.imgdata.sizes.iwidth; col++) { *output = raw.imgdata.image[raw.imgdata.sizes.iwidth*row + col][raw.COLOR(row, col)]; output++; } } } raw.recycle(); d->setProgress(1.0); return true; }
int libraw_COLOR(libraw_data_t *lr, int row, int col) { if(!lr) return EINVAL; LibRaw *ip = (LibRaw*) lr->parent_class; return ip->COLOR(row,col); }