对于一个项目,我必须保存很多大的原始图像,而我对达到的速度不满意。
图片 -来自相机的(自然)图像 -与CFA(拜耳) -12BPP; 2字节或位打包(2像素3字节) -7920 * 6004像素分辨率
我当前正在将libtiff与compression_none结合使用以获取当前最佳结果。 (由于我没有支持这种格式的查看器,因此我无法验证12位图像。)
主要是捕获下一个帧并将其写入的循环。
提高每秒帧数的方法有哪些? 蒂夫是个好选择吗? (您知道其他选择) libtiff是个好选择吗? (您知道其他选择) 这是使用libtiff的正确方法吗? (与Qt基本相同)
当使用异步调用压缩数据,然后(在某些循环之后)写入结果时,您是否希望即兴创作?什么是候选压缩算法?
struct ImageData
{
unsigned char* imgage_data;
size_t pitch;
int width,height;
bool bitpacked;
};
bool writeImageAsTiff (ImageData image,QString filename,QString extra)
{
TIFF* file_handle = TIFFOpen(filename.toStdString().c_str(),"w");
TIFFsetfield(file_handle,TIFFTAG_IMAGEWIDTH,image.width);
TIFFsetfield(file_handle,TIFFTAG_IMAGELENGTH,image.height);
TIFFsetfield(file_handle,TIFFTAG_SAMPLESPERPIXEL,1);
int bitspersample = (image.bitpacked) ? 12 : 16;
TIFFsetfield(file_handle,TIFFTAG_BITSPERSAMPLE,bitspersample);
TIFFsetfield(file_handle,TIFFTAG_ORIENTATION,ORIENTATION_TOPLEFT);
TIFFsetfield(file_handle,TIFFTAG_COMPRESSION,COMPRESSION_NONE);
TIFFsetfield(file_handle,TIFFTAG_MAXSAMPLEVALUE,std::pow(2,12)-1);
TIFFsetfield(file_handle,TIFFTAG_MINSAMPLEVALUE,0);
TIFFsetfield(file_handle,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG);
TIFFsetfield(file_handle,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_MINISBLACK);
TIFFsetfield(file_handle,TIFFTAG_ROWSPERSTRIP,defaultStripSize(file_handle));
char *text = "some super important infos";
TIFFsetfield(file_handle,TIFFTAG_IMAGEDESCRIPTION,text);
// some other info fields ...
uint32 y = 0;
while (y < image.height) {
uint32 * data = reinterpret_cast<uint32*>(reinterpret_cast<unsigned char*>(image.imgage_data)+y*image.pitch);
if (TIFFWriteScanline(file_handle,data,y) != 1) {
qDebug() << "Warning: TIFFWriteScanline failed";
TIFFClose(file_handle);
return false;
}
++y;
}
TIFFClose(file_handle);
return true;
}
编辑:
储存设备:
我运行了dd if=/dev/zero of=/tmp/output bs=8k count=10k
,结果告诉了我1,2 GB/s
。
df /tmp' gives Filesystem:
/ dev / sda1`。
我使用g ++和-O2进行编译。
当前,程序达到7 FPS,其中writeImageAsTiff
介于100到200毫秒之间。