Из вашего кода видно, что вы не читаете, что такое width
изображения ... скорее, вы читаете сумму fila_alineada
. Вы упомянули, что fila_alineada
был выровненный размер строки из-за «заполнения», но BMP-файлы должны иметь достаточное количество отступов в конце, чтобы расширить каждую строку до нескольких 4-х байтов ... это должно быть значение, хотя это легко вычисляется из BITMAPINFOHEADER путем деления фактического размера данных массива пикселей на количество строк в изображении. Размер данных массива пикселей сохраняется в смещении 0x22 в заголовке. Высота, как я уверен, вы правильно вывели, имеет смещение 0x16. Таким образом, аргумент fila_alineada
в значительной степени избыточен (то есть вы можете удалить его), и вы можете неправильно рассчитать это значение. Я бы просто использовал информацию в заголовке для расчета размера буфера, необходимого для сохранения информации в данной строке изображения.
Во-вторых, если вы просто попытались скопировать информацию BITMAPINFOHEADER из файла в буфер, который является некоторой репрезентативной структурой заголовка, имейте в виду, что компилятор мог заполнить структуру для целей выравнивания байтов ... поэтому для безопасности причины, по которым вам не следует просто читать весь заголовок из файла, а затем пытаться использовать memcpy()
для записи буфера в структуру BITMAPINFOHEADER. Вы должны прочитать значения заголовка по одному из файла и сохранить эти значения индивидуально в любой структуре, которая представляет BITMAPINFOHEADER. В противном случае, если вы сделаете первое, просто попытавшись прочитать первые N байтов файла и скопировать его в структуру, вы можете в конечном итоге из-за проблем с выравниванием байтов скопировать значения, которые являются неправильными, и, следовательно, все значения, которые вы пытаетесь прочитать из этой структуры, не будут представлять значения, связанные с вашим растровым файлом.