gpt4 book ai didi

c++ - 从cpp中的mysql blob解析BMP文件

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:51 24 4
gpt4 key购买 nike

我需要从 bmp 中获取宽度和高度值,以便在稍后从位图中的原始像素数据创建 gdk 像素图时,我可以将它们作为参数传递。我对 BMP 格式做了一些研究,文件头应该是这样的:

struct Fileheader
{
unsigned short Type; // signature - 'BM'
unsigned long Size; // file size in bytes
unsigned short Reserved1; // 0
unsigned short Reserved2; // 0
unsigned long OffBits; // offset to bitmap
unsigned long StructSize; // size of this struct (40)
unsigned long Width; // bmap width in pixels
unsigned long Height; // bmap height in pixels
unsigned short Planes; // num planes - always 1
unsigned short BitCount; // bits per pixel
unsigned long Compression; // compression flag
unsigned long SizeImage; // image size in bytes
long XPelsPerMeter; // horz resolution
long YPelsPerMeter; // vert resolution
unsigned long ClrUsed; // 0 -> color table size
unsigned long ClrImportant; // important color count
Fileheader()
{
Size=Width=Height=Planes=BitCount=Compression=SizeImage=XPelsPerMeter= YPelsPerMeter=ClrUsed=ClrImportant=Type=StructSize=Reserved1=Reserved2=OffBits=0;}
};
}

以标准方式将 blob 提取到行 [0] 之后

Fileheader fh;
memcpy(&fh, row[0], sizeof(Fileheader));

什么时候会给出乱码值

cout << "width: " << fh.Width << ", height: " << fh.Height << endl;

即:宽度:65536,高度:5626121834492592128

有人看到这里出了什么问题吗?顺便说一句,我在 64 位 linux 机器上。

最佳答案

如果您要以这种方式解析数据(不鼓励这样做),至少:

  • 使用正确的、独立于平台的类型。 uint16_t 代替 unsigned shortuint32_t 代替 unsigned long
  • 制作你的结构packed .

它不会在所有地方工作,但至少应该在 x86x86_64 上工作。

不鼓励这样做主要是因为它依赖于平台和编译器:

  • __attribute__ ((packed)) 是 gcc 扩展。其他编译器可能会以不同方式处理它。
  • 在某些平台上,不可能将结构紧密打包。在其他人身上,他们的工作速度会慢一些。
  • 它只能在小端机器上工作。

关于c++ - 从cpp中的mysql blob解析BMP文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11248523/

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