Вы получаете нарушение прав доступа, потому что многие графические программы неправильно устанавливают biSizeImage
.Используемое изображение, вероятно, имеет biSizeImage
, установленное в 0, поэтому вы не выделяете память для данных изображения (в действительности вы, вероятно, выделяете 4-16 байт, поскольку большинство реализаций malloc
вернетне NULL
значение, даже если запрошенный размер выделения равен 0).Поэтому, когда вы копируете данные, вы читаете за концом этого массива, что приводит к нарушению прав доступа.
Игнорируйте параметр biSizeImage
и вычисляйте размер изображения самостоятельно.Помните, что размер каждой строки сканирования должен быть кратным 4 байтам, поэтому вам нужно округлить:
// Pseudocode
#define ROUNDUP(value, power_of_2) (((value) + (power_of_2) - 1) & (~((power_of_2) - 1)))
bytes_per_line = ROUNDUP(width * bits_per_pixel/8, 4)
image_size = bytes_per_line * height;
Затем просто используйте один и тот же размер изображения для чтения в данных изображения и для переворачиванияэто.