Как добавить байты заполнения в растровое изображение?

Допустим, у меня есть растровые данные, которые я хочу записать в файл. Теперь я хочу записать их в виде файла bmp.

Эти данные не выровнены по DWORD, которые, если я правильно понимаю, должны быть дополнены достаточным количеством байтов, чтобы достичь следующего DWORD.

Однако, когда я пытаюсь дополнить его этим кодом:

bmFile.Write(0x0, (4-(actualWidth%4)));

Я получаю сообщение об ошибке. Если я пытаюсь выполнить отладку (я использую MSVC++ 6.0), следующий оператор указывает на ASSERT в CFile::Write, который утверждает, что первый параметр равен NULL. Так что это не удается..

Как я должен его проложить? мне выписать:

bmFile.Write("0x0"(4-(actualWidth%4)));

вместо? или это будет трактоваться буквально...?

Спасибо..


person krebstar    schedule 07.01.2009    source источник


Ответы (1)


Возможно, попробуйте:

bmFile.Write("\0\0\0\0", (4-(actualWidth%4)));

Ваш первый пример, как вы говорите, пытается записать данные, на которые указывает нулевой указатель. Ваш второй пример будет писать из байтов «0», «x», «0», которые имеют значения ASCII 0x30, 0x78, 0x30, что, вероятно, не соответствует вашим намерениям.

person Greg Hewgill    schedule 07.01.2009
comment
Что делает \0\0\0\0? Записать четыре нулевых бита или четыре нулевых байта? - person krebstar; 07.01.2009
comment
Каждый \0 представляет собой один нулевой байт (каждый байт равен 8 битам). Таким образом, это предоставляет четыре байта, из которых может извлечь метод Write, а второй параметр определяет, сколько из этих байтов нужно записать в файл. - person Greg Hewgill; 07.01.2009
comment
О, понятно.. То есть, если бы я на самом деле запустил наш код и значение деления модуля оценивалось бы, скажем, как 3, я бы на самом деле записал 12 байтов нулей? Может быть, вы можете изменить свой пример, чтобы сказать \0 вместо \0\0\0\0, чтобы я мог отметить его как правильный ответ :) - person krebstar; 07.01.2009
comment
Нет, вторым параметром Write() является количество байтов. Даже если вы передадите больше байтов, чем указано в первом параметре, будет записано только указанное количество байтов. Использование только \0 было бы неправильным, потому что для записи не хватило бы байтов, если бы вы хотели записать 3 байта. - person Greg Hewgill; 07.01.2009