gpt4 book ai didi

C++ PNG header missread IHDR data chunk 长宽高

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:15 26 4
gpt4 key购买 nike

我正在尝试为一个类创建一个方法,该方法只读取 PNG 文件直到 IHDR 图像 header 的末尾(没有它的 CRC32 block 。问题来自每个“多于一个字节”的整数(即 IHDR 数据 block 长度、宽度和高度)。这是我的代码:

#include <iostream>
#include <fstream>
using namespace std;

typedef struct PNG_HEADER pngHeader;
struct PNG_HEADER{
unsigned char PNGSignature[8];
size_t nb;
unsigned char ImageHeader[4];
size_t width;
size_t height;
unsigned char bitDepth;
unsigned char colorType;
unsigned char compressionMethod;
unsigned char filterMethod;
unsigned char interlaceMethod;
};

class testPNG{

public:

bool readPNGHeader(string filename){
pngHeader PNGheader;

ifstream file(filename.data(), std::ios_base::binary);

if(!file.is_open())
return false;

if( !file.read((char *)&PNGheader, sizeof(PNGheader)))
return false;


for(int i = 0; i < 8; i++)
printf("%d ", PNGheader.PNGSignature[i]);

printf("\n");
printf("%d\n", PNGheader.nb);

for(int i = 0; i < 4; i++)
printf("%d ", PNGheader.ImageHeader[i]);

printf("\n");
printf("%d\n", PNGheader.width );
printf("%d\n", PNGheader.height );
printf("%d\n", PNGheader.bitDepth );
printf("%d\n", PNGheader.colorType );
printf("%d\n", PNGheader.compressionMethod );
printf("%d\n", PNGheader.filterMethod );
printf("%d\n", PNGheader.interlaceMethod );

return true;
}
};


int main(void)
{
testPNG test;
test.readPNGHeader("test.png");

return 0;
}

打印结果是这样的(控制台上显然没有显示注释):

137 80 78 71 13 10 26 10 //[PNG Signature OK!][1]
218103808 //this should read 13 as the length is the sum of the number of byte needed for each data field contained in the IHDR Data chunk that follows the IHDR Image Header chunk.
73 72 68 82 //[IHDR Image Header chunk OK!][2]
1879244800 //fail to give the correct width
973078528 //fail to give the correct height
8 // OK!
6 // OK!
0 // OK!
0 // OK!
0 // OK!

如 w3c 网站上所写; (数据 block 的)长度值存储在 "A four-byte unsigned integer" 中. the width and height 也是如此。的形象。所以我也尝试了 unsigned int 和 unsigned short 但似乎没有任何效果。

尽管我使用了 printfs(我不知道如何使用 cout 将字符格式化为整数),但如果可能的话,我正在寻找 C++ 解决方案。

谢谢

最佳答案

您的机器或您的编译器使用相反的顺序来存储多字节值。

请参阅同一引用资料中的“7.1 整数和字节顺序”:

All integers that require more than one byte shall be in network byte order ...

后跟一个图表来说明它。

要获得字节数的正确值,请使用预定义函数之一(我永远不记得哪个函数做了什么;请阅读 How do you write (portably) reverse network byte order?)反转它们或编写您自己的函数。

您的示例值 218103808 在以十六进制打印时显示 0xD000000;反转字节会产生正确的预期结果 0xD13

关于C++ PNG header missread IHDR data chunk 长宽高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com