Сохранить растровое изображение в файл имеет ноль в поле размера изображения - PullRequest
1 голос
/ 27 января 2011

Когда я использую метод Bitmap.Save с форматом ImageFormat.Bmp, я обнаруживаю, что информация о заголовке растрового изображения в файле имеет ноль в поле biSizeImage.

Из того, что я вижу, все в порядке в соответствии со спецификациями, но, к сожалению, дрянное встроенное устройство, с которым я вынужден работать, настаивает на том, чтобы оно было правильно установлено.

Итак, вопрос в том, как сделать так, чтобы это поле информации заголовка всегда устанавливалось при сохранении растрового изображения?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Проблема, как вы подозреваете, заключается в том, что 0 является вполне допустимым значением для поля размера изображения растрового изображения RGB.Документация MSDN для структуры BITMAPINFOHEADER подтверждает этот факт:

biSizeImage
Размер изображения в байтах.Это может быть установлено в ноль для BI_RGB битовых карт.

Если biCompression равен BI_JPEG или BI_PNG, biSizeImage указывает размер буфера изображения JPEG или PNGсоответственно.

Таким образом, реализация в .NET Framework просто делает вещи стандартным, документированным способом.Поскольку вам нужно что-то еще, вам придется самостоятельно обрабатывать процесс сохранения в файл, что позволит вам вручную изменить biSizeImage член структуры BITMAPINFOHEADER.

Доступен довольно полный примерздесь: Сохранение контрольного изображения в файл растрового изображения .Конечно, это написано для Compact Framework, но большинство отдельных компонентов по-прежнему применимы.Вам потребуется P / Invoke нескольких функций из Windows API (см. Определения www.pinvoke.net ) и работа с DC.

Перенос чертежа в свойРуки, вероятно, также будут быстрее, потому что вы используете подсистему GDI, а не GDI +.Статья об этом общем подходе доступна здесь: 1bpp в C # , и, похоже, она демонстрирует взятие вещей в свои руки с помощью структуры BITMAPINFOHEADER.

Если вы понимаете неуправляемыйКод C ++, здесь есть учебник, который может дать вам представление о том, что вам нужно реализовать в C #, чтобы сделать то же самое: Загрузка и сохранение растровых изображений .Как видите, требуемый код на самом деле не такой длинный, хотя все же больше, чем метод из одной строки Bitmap.Save.

0 голосов
/ 09 августа 2018

Я тоже столкнулся с этой проблемой, и она была решена простым трюком. сохраните растровое изображение, затем откройте его как файловый поток и вручную измените поле biSizeimage.

picbpp.Save("pic.bmp", ImageFormat.Bmp);
string path = "pic.bmp";
FileStream fs = File.Open(path, FileMode.Open, FileAccess.Write, FileShare.None);
// Change biSizeimage field manually.
Byte[] info = new byte[] {0x10,0x59};
fs.Seek(34, SeekOrigin.Begin);
fs.Write(info, 0, info.Length);
fs.Close();
...