![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Всем доброго дня!
Уважемые программисты, подскажите как сохранить изображение в BMP файл из имеющегося битмапа! Если можно примерчик! Или функии для этого! Пишу на WinApi. За ранее благодарю и низко кланяюсь! |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
ZC1989 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
Евгений, а разве fwrite уже не работает?
-------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Я имел ввиду как записать эти структуры
BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; RGBQUAD aColors[]; BYTE aBitmapBits[]; в файл и как их заполнить? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Битмап это тот который в памяти, т.е. DDB? Который создается функциями CreateBitmap, CreateCompatibleBitmap и т.д. ? Или тот который DIB секция? У которого разрешен доступ к битовой карте? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Верно, который создается CreateBitmap!
Добавлено через 8 минут и 21 секунду Я понял что структура файла BMP состоит из следущих структур: BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; RGBQUAD aColors[]; BYTE aBitmapBits[]; так перед записью в файл их необходимо какимто образом заполнить, каждой переменной своё! Так вот подскажите как это сделать! |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Тогда сначала нужно извлечь битовую карту. А потом последовательно заполнять структуры и писать их, после записи табицы цветов записать битовую карту и выровнять то что получилось на границу 4х байт. Проблема в записи структур в файл? Добавлено через 2 минуты и 59 секунд О значении каждого из полей и о том что туда писать можно подробно прочитать тут. http://forum.vingrad.ru/index.php?show_typ...c=94227&hl= -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Вот я попробовал сделать как понял из прочитанного из книги:
Исправте пожалуйста если чтото напутал! |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
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 - это же указатель на указатель ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
строка 17: 24-битный битмап не имеет палитры, т.е. массив RGBQUAD писать не нужно
строка 28: fwrite(&mBits,Size,1,File); Это сообщение отредактировал(а) 586 - 20.5.2007, 00:21 |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Что то не пойму, так что надо записывать в файл, только это
fwrite(mBits,Size,1,File); или BITMAPFILEHEADER и BITMAPINFOHEADER структуры тоже надо?
А как узнать размер файла? |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Вроде что то в файл уже записывается но изображение не открывается, посмотрите ещё раз код что тут непраильно, у меня предположение что структуры BITMAPFILEHEADER и BITMAPINFOHEADER заполнены неверно!
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Вроде уже грубых ошибок не видно, кроме отсутствия fclose(File);
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
586 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
строка 22: замени BYTE на RGBTRIPLE, или long Size = Bitmap.bmWidthBytes * Bitmap.bmHeight * sizeof(RGBTRIPLE)
|
|||
|
||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Точно! Выше по коду
Значит Bitmap.bmWidthBytes - это число байт в строке а не ее длина.
А вот это уже не верно. Bitmap.bmWidthBytes * Bitmap.bmHeight * sizeof(RGBTRIPLE) будет в 3 раза больше нужного размера. Да и какой смысл использовать RGBTRIPLE, обработки данных на этом этапе нет, только запись в файл, байты как раз точно отражают размер блока данных. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
![]() Size правильно определен: так как Bitmap.bmWidthBytes - это длина строки в байтах (уже выровненная) сорри, не заметил, что еще страница есть. Это сообщение отредактировал(а) zkv - 20.5.2007, 13:56 |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Вот немного переделал, теперь хоть размер сохраняемого файла сходится с исходным. Посмотрите как я передел, но всёравно изображение не открывается.
Это сообщение отредактировал(а) Евгений - 20.5.2007, 21:09 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Была еще одна маленькая ошибочка
bitfileh.bfType =Bitmap.bmType; Bitmap.bmType всегда равна нулю а не сигнатуре битмапа Правильно будет bitfileh.bfType = 0x4D42; Вот как только изменил сразу все заработало
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
zkv |
|
||||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
не учитываешь выравнивание строк, может быть ошибка из за этого вылазит тут:
когда не хватает места под растр раньше у тебя правильно было:
А вообще смотри какие значения возвращают функции + GetLastError() юзай |
||||||
|
|||||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Евгений, WinHex лучший друг программиста
![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Alexeis сделал по твоему коду вроде всё ок, только вот при открытии изображения вне моей программы он пишет "Ошибка при построении изображения". Открыл Paint там кракозябли но изображение! Незнаешь в чем дело?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Если чесно, то функцией GetBitmapBits я ни разу не пользовался и подозреваю, что она работает как-то по другому. Я всегда использовал GetDibBits. Она точно возвращает растр. Если изображение кривое значит не получил битовую карту. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Таки я был прав эта функция работает для совместимости и битмапы больше 64кб видимо ей не по зубам, кроме того я точно вычислил размер буфера данных исходя из документации а не брал его из структуры (там он дан для цвета 32 бита на пиксел)
Вот в итоге получилось так
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Огромное тебе спасибо, Alexeis! Все получилось! Благодаря таким людям и набираешься опыта, разрешишь по всем вопросам обращаться к тебе?
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Неа, мне работать тоже нужно, ну хоть иногда ![]() ![]() -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Всё равно спасибо! Ещё вопросик, не подскажите что собой представляет mBits, это набор цветов или чего? Про хочу попробовать написать программу самму простую шифрования изображений. Это вообще возможно? Если кто-нибудь знает какой-нибудь простой способ шифрования изображений поделитесь!
|
|||
|
||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Матрица пикселей, т.е. набор строк, в которых данные о цвете пикселов расположены слева направо, снизу вверх. Это значит что массив начнется не с первой строки а с последней (правда бывают исключения). Цвет это либо самого его значение (верно для форматов 16, 24, 32 бита на пиксел) либо индекс цвета в палитре (верно для форматов 1, 4, 8 бит на пиксел).
А какая разница что шифровать? Файлы все одинаковые, что звук что графика что текст, просто массив байтов.
В Windows есть CryptoApi. Первая ссылка в гугле http://www.cryptopro.ru/cryptopro/documentation/capi.htm -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
Евгений |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 14.6.2006 Где: г. Невинномысск Репутация: нет Всего: 1 |
Я имею ввиду чтобы изображение зашифровалось потом его открыл, а там место нормальной картинки всякая чушь.
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Евгений, будет не так просто. Размер шифровки может оказаться больше размера исходных данных, потому вероятно прийдеться перед этим графические данные упаковать, например при помощи библиотеки zLib (идет с виндой), а затем уже зашифровать. Если картинка была со смыслом, а не просто рэндом, то она сожмется неплохо. После шифровки размер блока растра должен получиться меньше исходного, потому для записи понадобиться дописать падинг (т.е. баласт).
В MSDN е есть пример использования CryptoApi. Эти методы шифрования проверены и надежны. Т.е. устойчивы при том что алгоритм шифровки/расшифровки известен. http://msdn2.microsoft.com/en-us/library/aa382052.aspx Это сообщение отредактировал(а) Alexeis - 23.5.2007, 09:39 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |