gpt4 book ai didi

c - fread 返回 0,从 BMP 文件中读取像素

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:49 26 4
gpt4 key购买 nike

我正在使用这段代码从 bmp 文件中获取像素。我已经阅读了前几行中的标题和调色板,所以我的 FILE * 指向像素数组的开头。它读取第一行 OK,返回 1000,这是它应该的,但是当它尝试读取第二行像素时,它返回 0。

这是接收 FILE * 的函数,读取像素行并尝试将它们保存到 bmp_type 中。 fila_alineada 是对齐的行大小,由于填充而必须这样做。

bool leer_pixels_8bpp(   FILE *fbmp, bmp_t *imagen,
const uint32_t fila_alineada,
const bool btopdown ){
int32_t i;
long x, y;
int32_t height, width, contador;
uint8_t *ptmp;

uint8_t bufferfila[fila_alineada];

height = imagen->infoheader.height;
width = imagen->infoheader.width;
contador = height;

i = btopdown ? 1 : -1;
y = btopdown ? 0 : ( height - 1 );

for ( ; contador--; y += i ) /* row loop */
{
/* reading row */
if ( fread( bufferfila, sizeof( uint8_t ), fila_alineada, fbmp ) != fila_alineada )
{ /* HERE is the PROBLEM, it reads ok once, but in the second loop it returns 0 */
fprintf( stderr, "Error reading pixels row.\n" );
return false;
}

ptmp = bufferfila;
/* saving pixels into bmp_t */
for ( x = 0L; x < width; x++ )
{
imagen->pixels[y][x] = imagen->paleta.colores[ *ptmp++ ];
}

}

return true;

我试过不同的 bmp!问题在这里还是我应该考虑审查整个代码?希望有人能帮助我,在此先感谢。

最佳答案

从您的代码看来,您没有读取图像的 width 是什么……而是读取了一定量的 fila_alineada。你提到 fila_alineada 是对齐的行大小,因为“填充”,但 BMP 文件应该只在末尾有足够的填充以将每行扩展到 4 字节的倍数......那应该是一个值,尽管可以通过将实际像素数组数据大小除以图像中的行数从 BITMAPINFOHEADER 轻松计算出该值。像素数组数据大小存储在 header 中的偏移量 0x22 处。正如我确定您已正确推断的那样,高度位于偏移量 0x16 处。所以参数 fila_alineada 几乎是多余的(即,您可以删除它),并且您可能错误地计算了这个值。我会简单地使用 header 中的信息来计算将信息保存在给定图像行中所需的缓冲区大小。

其次,如果您只是尝试将 BITMAPINFOHEADER 信息从文件复制到缓冲区中,该缓冲区是一些代表性的 header 结构,请记住,编译器可能出于字节对齐目的填充了该结构......因此为了安全您不应该简单地从文件中读取整个 header ,然后尝试使用 memcpy() 将缓冲区写入 BITMAPINFOHEADER 结构的原因。您应该从文件中逐个读取 header 值,并将这些值分别存储到表示 BITMAPINFOHEADER 的任何结构中。否则,如果你做前者,通过简单地尝试读取文件的前 N ​​个字节,并将其复制到一个结构中,你可能会因为字节对齐问题而最终复制不正确的值,因此所有您尝试从该结构中读回的值将不代表与您的位图文件关联的值。

关于c - fread 返回 0,从 BMP 文件中读取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906583/

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