Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取二进制16位流文件并写入16位PGM(C+;+;)_C++_Binary_Pgm - Fatal编程技术网

C++ 读取二进制16位流文件并写入16位PGM(C+;+;)

C++ 读取二进制16位流文件并写入16位PGM(C+;+;),c++,binary,pgm,C++,Binary,Pgm,这是我到目前为止第一次使用搜索功能。但现在我在以下问题上浪费了一整天: 我录制了一个12位(写为16位)的灰度视频,并将其直接写入一个二进制流文件(没有标题等) 现在的任务是读取文件并将每一帧输出为16位pgm 下面的剪贴说明了我的尝试。输出是有效的pgm,但带有“白噪声” 。。。 imageBufferShort=新短[图像宽度*图像高度*大小(短)]; ... streamFileHandle.read(reinterpret_cast(imageBufferShort),2*imageWi

这是我到目前为止第一次使用搜索功能。但现在我在以下问题上浪费了一整天:

我录制了一个12位(写为16位)的灰度视频,并将其直接写入一个二进制流文件(没有标题等)

现在的任务是读取文件并将每一帧输出为16位pgm

下面的剪贴说明了我的尝试。输出是有效的pgm,但带有“白噪声”

。。。
imageBufferShort=新短[图像宽度*图像高度*大小(短)];
...
streamFileHandle.read(reinterpret_cast(imageBufferShort),2*imageWidth*imageHeight)//双倍金额,因为8比特字符!
//因为.read only需要字符,我想,我只是读取了两倍的字符字节,当它被解释为短(=16位)时,一切都正常吗?!?
…现在,pgm输出:
std::ofstream f|hnd(文件名,std::ios|u base::out | std::ios|u base::binary | std::ios|u base::trunc);
//写简单标题
f_hnd.write(“P5\n”,3);

正如@Domi和@JoeZ所指出的:你的结局可能是一团糟。也就是说,字节的顺序是错误的


要解决问题,您必须迭代每个像素并交换其字节,然后再将其写入文件。

问题已解决。非常感谢大家。持久性确实是个问题。解决方案如下:

    f_hnd << "P5" << " " << imDimensions.GetWidth() << " " << imDimensions.GetHeight() << " " << "4095\n";

    // convert imageBufferShort to Big-Endian format
    unsigned short imageBufferShortBigEndian[imDimensions.GetWidth()*imDimensions.GetHeight()];

    for (int k=0 ; k<imDimensions.GetWidth()*imDimensions.GetHeight() ; k++)
    {
        imageBufferShortBigEndian[k] = ( (imageBufferShort[k] << 8) | (imageBufferShort[k] >> 8) );
    }

    f_hnd.write(reinterpret_cast<char*>(imageBufferShortBigEndian),2*imDimensions.GetWidth()*imDimensions.GetHeight());
    f_hnd.close();

f_hnd您是否确保输入无噪声?此外,如果使用
new
,您不需要乘以sizeof(t)。但这并不影响正确性。最后,请确保系统的输入端与输入端匹配。@多米,我打赌是端。请注意,对于maxval大于255的PGM P5格式,要求您每像素发送两个字节,最高有效字节优先(也称为big-endian)。现在大多数计算机都是小端,这意味着你可能需要在输入和输出之间交换字节对。(PGM文件:)好的。非常感谢。我从来没有遇到过endian的事。我会在星期一试试,然后报告。
    f_hnd << "P5" << " " << imDimensions.GetWidth() << " " << imDimensions.GetHeight() << " " << "4095\n";

    // convert imageBufferShort to Big-Endian format
    unsigned short imageBufferShortBigEndian[imDimensions.GetWidth()*imDimensions.GetHeight()];

    for (int k=0 ; k<imDimensions.GetWidth()*imDimensions.GetHeight() ; k++)
    {
        imageBufferShortBigEndian[k] = ( (imageBufferShort[k] << 8) | (imageBufferShort[k] >> 8) );
    }

    f_hnd.write(reinterpret_cast<char*>(imageBufferShortBigEndian),2*imDimensions.GetWidth()*imDimensions.GetHeight());
    f_hnd.close();