保存大原始图像的有趣方式

问题描述 投票:0回答:1

对于一个项目,我必须保存很多大的原始图像,但我对达到的速度不满意。

图像-来自相机的(自然)图像-与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毫秒之间。

c++ performance qt tiff libtiff
1个回答
0
投票

您可以轻松地使每个写入异步:

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。阅读有关QByteArrayQt implicit sharing的信息。

当然尝试使用探查器来查找瓶颈。

© www.soinside.com 2019 - 2024. All rights reserved.