Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохрание BMP файла, Сохрание BMP файла 
:(
    Опции темы
Евгений
Дата 19.5.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Всем доброго дня!

Уважемые программисты, подскажите как сохранить изображение в BMP файл из имеющегося битмапа! Если можно примерчик! Или функии для этого! Пишу на WinApi.

За ранее благодарю и низко кланяюсь!
PM MAIL WWW   Вверх
jonie
Дата 19.5.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

 подскажите как сохранить изображение в BMP файл из имеющегося битмапа!
?!  "толи лыжи не едут...".....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ZC1989
Дата 19.5.2007, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

Репутация: 1
Всего: 1



Евгений, а разве fwrite уже не работает?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Евгений
Дата 19.5.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Я имел ввиду как записать эти структуры 

BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
RGBQUAD aColors[];
BYTE aBitmapBits[];

в файл и как их заполнить?
PM MAIL WWW   Вверх
Alexeis
Дата 19.5.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Евгений @  19.5.2007,  19:50 Найти цитируемый пост)
Уважемые программисты, подскажите как сохранить изображение в BMP файл из имеющегося битмапа!

  Битмап это тот который в памяти, т.е. DDB? Который создается функциями CreateBitmap, CreateCompatibleBitmap и т.д. ? Или тот который DIB секция? У которого разрешен доступ к битовой карте?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Евгений
Дата 19.5.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Верно, который создается CreateBitmap!

Добавлено через 8 минут и 21 секунду
Я понял что структура файла BMP состоит из следущих структур:
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
RGBQUAD aColors[];
BYTE aBitmapBits[];
так перед записью в файл их необходимо какимто образом заполнить, каждой переменной своё! Так вот подскажите как это сделать!

PM MAIL WWW   Вверх
Alexeis
Дата 19.5.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(Евгений @  19.5.2007,  23:43 Найти цитируемый пост)
Верно, который создается CreateBitmap!

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

Добавлено через 2 минуты и 59 секунд
О значении каждого из полей и о том что туда писать можно подробно прочитать тут. 
http://forum.vingrad.ru/index.php?show_typ...c=94227&hl=


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Евгений
Дата 19.5.2007, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Вот я попробовал сделать как понял из прочитанного из книги:
Код

GetObject(hBitm,sizeof(BITMAP),(LPVOID) &Bitmap);
    BITMAPFILEHEADER bitfileh;
    memset(&bitfileh,0,sizeof(BITMAPFILEHEADER));
    bitfileh.bfType            =0;
    bitfileh.bfSize            =Bitmap.bmWidthBytes * Bitmap.bmHeight;
    bitfileh.bfReserved1    =0;
    bitfileh.bfReserved2    =0;
    bitfileh.bfOffBits =sizeof(BITMAPFILEHEADER)+(sizeof(BITMAPINFOHEADER)*24)+sizeof(RGBQUAD);

    BITMAPINFOHEADER bitinfoh;
    memset(&bitinfoh,0,sizeof(BITMAPINFOHEADER));
    bitinfoh.biSize            =sizeof(BITMAPINFOHEADER);
    bitinfoh.biWidth        =Bitmap.bmWidthBytes;
    bitinfoh.biPlanes        =1;
    bitinfoh.biBitCount        =24;

    RGBQUAD hColor[24];// = GetDIBColorTable(hdc,

    long Size = Bitmap.bmWidthBytes * Bitmap.bmHeight;
    BYTE *mBits = new BYTE[Size];
    GetBitmapBits(hBitm, Size, mBits);

    FILE *File;
    File = fopen(szFile,"w");
    fwrite(&bitfileh,sizeof(bitfileh),1,File);
    fwrite(&bitinfoh,sizeof(bitinfoh),1,File);
    fwrite(&hColor,sizeof(hColor),1,File);
    fwrite(&mBits,sizeof(mBits),1,File);
    fclose(File);



Исправте пожалуйста если чтото напутал!
PM MAIL WWW   Вверх
Alexeis
Дата 20.5.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата

 bfSize - это размер самого файла в байтах.


bitinfoh.biBitCount        =24; 
  это беспалитровый формат так что 

bitfileh.bfOffBits =sizeof(BITMAPFILEHEADER)+(sizeof(BITMAPINFOHEADER)*24)+sizeof(RGBQUAD);
Абсолютно неверно.

Верно будет
bitfileh.bfOffBits =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)

дальше 
fwrite(&mBits,sizeof(mBits),1,File); mBits - это указатель, его размер всегда 4 байта, а нужна длинна массива в байтах

   fwrite(&hColor,sizeof(hColor),1,File); - это тоже не нужно.

Добавлено через 2 минуты и 27 секунд
кстати, к тому же fwrite(&mBits,sizeof(mBits),1,File); &mBits - это же указатель на указатель smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
586
Дата 20.5.2007, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



строка 17: 24-битный битмап не имеет палитры, т.е. массив RGBQUAD писать не нужно
строка 28: fwrite(&mBits,Size,1,File);

Это сообщение отредактировал(а) 586 - 20.5.2007, 00:21
PM   Вверх
Евгений
Дата 20.5.2007, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Что то не пойму, так что надо записывать в файл, только это
fwrite(mBits,Size,1,File);
или BITMAPFILEHEADER и BITMAPINFOHEADER структуры тоже надо?

Цитата

bfSize - это размер самого файла в байтах.

А как узнать размер файла?
PM MAIL WWW   Вверх
Евгений
Дата 20.5.2007, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 14.6.2006
Где: г. Невинномысск

Репутация: нет
Всего: 1



Вроде что то в файл уже записывается но изображение не открывается, посмотрите ещё раз код что тут непраильно, у меня предположение что структуры BITMAPFILEHEADER и BITMAPINFOHEADER заполнены неверно!
Код

GetObject(hBitm,sizeof(BITMAP),(LPVOID) &Bitmap);
    long Size = Bitmap.bmWidthBytes * Bitmap.bmHeight;

    BITMAPFILEHEADER bitfileh;
    memset(&bitfileh,0,sizeof(BITMAPFILEHEADER));
    bitfileh.bfType            =Bitmap.bmType;
    bitfileh.bfSize            =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+Size;
    bitfileh.bfReserved1    =0;
    bitfileh.bfReserved2    =0;
    bitfileh.bfOffBits        =sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

    BITMAPINFOHEADER bitinfoh;
    memset(&bitinfoh,0,sizeof(BITMAPINFOHEADER));
    bitinfoh.biSize            =sizeof(BITMAPINFOHEADER);
    bitinfoh.biWidth        =Bitmap.bmWidthBytes;
    bitinfoh.biHeight        =Bitmap.bmHeight;
    bitinfoh.biPlanes        =1;
    bitinfoh.biBitCount        =24;

    RGBQUAD hColor[24];

    BYTE *mBits = new BYTE[Size];
    GetBitmapBits(hBitm, Size, mBits);

    FILE *File;
    File = fopen(szFile,"w");
    fwrite(&bitfileh,sizeof(bitfileh),1,File);
    fwrite(&bitinfoh,sizeof(bitinfoh),1,File);
    
    fwrite(mBits,Size,1,File);

PM MAIL WWW   Вверх
Alexeis
Дата 20.5.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Вроде уже грубых ошибок не видно, кроме отсутствия fclose(File);


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
zkv
Дата 20.5.2007, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



тут опечатка?
Цитата(Евгений @  20.5.2007,  00:50 Найти цитируемый пост)
    bitinfoh.biWidth        =Bitmap.bmWidthBytes;

PM MAIL   Вверх
586
Дата 20.5.2007, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



строка 22: замени BYTE на RGBTRIPLE, или long Size = Bitmap.bmWidthBytes * Bitmap.bmHeight * sizeof(RGBTRIPLE)
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1032 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.