To learn about JPEG compression, I downloaded a simple BMP/JPEG encoder that I have been examining. I have several questions, hopefully someone can help me with. I'm not a trained computer scientist, just a hobby programmer. Grateful for any help.
以下代码读取位图,为简洁起见,我省略了一些信息。我知道位图标头是作为结构体编写的,因此可以将组件直接读取为变量,而无需进行迭代。
BYTE是uint8_t的typedef
int bmp_load(BMP *pb, char *file)
{
BMPFILEHEADER header = {0};
FILE *fp = NULL;
BYTE *pdata = NULL;
int i;
fp = fopen(file, "rb");
if (!fp) return -1;
fread(&header, sizeof(header), 1, fp);
pb->width = header.biWidth;
pb->height = header.biHeight;
pb->stride = ALIGN(header.biWidth * 3, 4);
pb->pdata = malloc(pb->stride * pb->height);// allocate a byte for each element of bitmap?
if (pb->pdata) {
pdata = (BYTE*)pb->pdata + pb->stride * pb->height; // Title question: Cast pdata as uint8_t buffer but what is the addition for? I think it has to do with padding a BMP file. Without addition there is a bus error: 10
for (i=0; i<pb->height; i++) {
pdata -= pb->stride; // What is the subtraction for?
fread(pdata, pb->stride, 1, fp);
}
}
fclose(fp);
return pb->pdata ? 0 : -1; // If pdata was being modified in the for loop, why is pb->pdata returned?
}
我的问题是代码中的注释,也粘贴在下面。 加法有什么作用?我认为这与填充BMP文件有关。不添加总线错误:10
pdata = (BYTE*)pb->pdata + pb->stride * pb->height;
减法是什么?
pdata -= pb->stride;
最后,为什么返回pb-> pdata,但是实际上在代码中修改了它的pdata呢?