【发布时间】:2013-11-02 20:42:44
【问题描述】:
我有标题和信息标题。使用以下代码,第一个像素读取正常。
// The BMPHEADER structure.
typedef struct {
byte sigB;
byte sigM;
int32_t fileSize;
int16_t resv1;
int16_t resv2;
int32_t pixelOffset;
} tBmpHeader;
// The BMPINFOHEADER structure.
typedef struct {
int32_t size;
int32_t width;
int32_t height;
int16_t colorPlanes;
int16_t bitsPerPixel;
byte zeros[24];
} tBmpInfoHeader;
typedef uint8_t byte;
typedef struct {
byte blue;
byte green;
byte red;
} tPixel;
// A BMP image consists of the BMPHEADER and BMPINFOHEADER structures, and the 2D pixel array.
typedef struct {
tBmpHeader header;
tBmpInfoHeader infoHeader;
tPixel **pixel;
} tBmp;
tPixel **BmpPixelAlloc(int pWidth, int pHeight)
{
tPixel **pixels = (tPixel **)malloc (pHeight * sizeof(tPixel *));
for (int row = 0; row < pHeight; ++row)
{
pixels[row] = (tPixel *)malloc(pWidth * sizeof(tPixel));
}
return pixels;
}
tError BmpRead(char *pFilename, tBmp *pBmp)
{
pBmp->pixel = BmpPixelAlloc(pBmp->infoHeader.width, pBmp->infoHeader.height);
if(FileRead(file, &pBmp->pixel, sizeof(tPixel), 1)!=0)
{
errorCode = ErrorFileRead;
}
}
与我交谈的一位导师说我应该做以下事情
int i = 0;
while(!feof(file))
{
if(FileRead(file, &pBmp->pixel[i], sizeof(tPixel), 1)!=0)
{
errorCode = ErrorFileRead;
}
++i;
}
但这给了我一个分段错误。如果我在循环中放置一个打印,它会在说分段错误之前打印几千次。我尝试使用双 for 循环,但它甚至无法编译。我在谷歌上花了几个小时,但无法弄清楚。
【问题讨论】:
-
何必呢?为此已经有一个易于使用且易于理解的library。
-
好吧,即便如此,请尝试浏览该库中的代码。你可能会学到一些东西。
-
旁注:注意
tBmpHeader中的结构填充:两个单字节可能会导致一个 2 字节的孔来对齐以下uint32_t(打包结构或删除这些魔术字节并读取它们分开) -
@sam 是的,我已经不得不处理我最终阅读该结构的碎片。