对于一个项目,我必须保存很多大的原始图像,而我对达到的速度不满意。
图片 -来自相机的(自然)图像 -与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毫秒之间。
答案 0 :(得分:1)
您可以轻松地尝试使每个写入异步:
QFuture<bool> writeImageAsTiff (ImageData image, QString filename, QString extra)
{
return QtConcurrent::run([=]() -> bool
{
TIFF* file_handle = TIFFOpen(filename.toStdString().c_str(),"w");
TIFFSetField(file_handle,TIFFTAG_IMAGEWIDTH,image.width);
...
...
...
TIFFClose(file_handle);
return true;
});
}
还请注意,在这种情况下,不能使用指针unsigned char* imgage_data
。
但是您可以将unsigned char* imgage_data
替换为QByteArray imgage_data
。阅读有关QByteArray和Qt implicit sharing的信息。
当然尝试使用探查器来查找瓶颈。