Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение графики 
:(
    Опции темы
ivan__
Дата 21.8.2002, 17:33 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











как сохраниь в графический файл (например bmp) содержимое из контекста памяти (графику)?
  Вверх
bavc
Дата 21.8.2002, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 14.8.2002

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



Есть книга форматы графических файлов толстенная там про все есть но если хочешь могу формат bmp скинуть. А есть еще спец. компонентики в Билдере напрмер.
PM MAIL WWW ICQ   Вверх
ivan__
Дата 21.8.2002, 23:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











bavc, скинь пожалуйста, формат bmp на мыло [email protected]
Заранее благодарен.
  Вверх
Baa
Дата 22.8.2002, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Может поможет =)
HANDLE hFile = CreateFile ("c:\\test.bmp",
  GENERIC_READ,
      NULL,
      NULL,
      OPEN_EXISTING,
      NULL,
      NULL);

BITMAPFILEHEADER bmFileHeader;
DWORD dwNumberOfBytesRead = 0;

ReadFile (hFile, (void*)&bmFileHeader, sizeof (bmFileHeader), &dwNumberOfBytesRead, NULL);
if (bmFileHeader.bfType != 0x4d42) {
::MessageBox (NULL, "Это не файл растра", "Error", NULL);
::CloseHandle (hFile);
} else {
DWORD fileLength = GetFileSize (hFile, NULL);
DWORD dibSize    = fileLength - sizeof (bmFileHeader);

#define GlobalAllocP(flags,cb)(GlobalLock(GlobalAlloc((flags),(cb))));
BYTE* pDib = (BYTE*) GlobalAllocP (GMEM_MOVEABLE, dibSize);

ReadFile (hFile, (void*)pDib, dibSize, &dwNumberOfBytesRead, NULL);
       CloseHandle (hFile);

LPBITMAPINFO       pBmInfo       = (LPBITMAPINFO) pDib;
LPBITMAPINFOHEADER pBmInfoHeader = (LPBITMAPINFOHEADER) pDib;

HANDLE hFile1 = CreateFile ("c:\\test1.bmp",
  GENERIC_WRITE,
      NULL,
      NULL,
      CREATE_ALWAYS,
      NULL,
      NULL);

DWORD dwNumberOfBytesWrite = 0;
WriteFile (hFile1, (void*) &bmFileHeader, sizeof(bmFileHeader), &dwNumberOfBytesWrite, NULL);
WriteFile (hFile1, (void*) pDib, dibSize, &dwNumberOfBytesWrite, NULL);
CloseHandle (hFile1);

GlobalFree (pBmInfo);
}


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
ivan__
Дата 22.8.2002, 05:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Baa, это ты привел пример того, как прочитать данные из одного графического файла и записать их в другой граф. файл, то есть по сути, просто копирование.
а если я самостоятельно создаю контекст памяти, что-то вывожу туда, например:

...
CClientDC dc(this);
dc.SetPixel(0,0,RGB(255,255,255));
dc.Rectangle(1,1,100,100);
...

ну и так далее, то как потом все то, что нарисовалось в контексте dc, сохранить в файле bmp?
  Вверх
Baa
Дата 22.8.2002, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Учитывая то, что я тебе написал и это: http://www.codeguru.com/bitmap/window_to_file.shtml
должен разобраться ;-)
А вообще, можно было зайти на наш любимый codeguru скажем сюда: http://www.codeguru.com/bitmap/index.shtml




--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
oldm
Дата 13.7.2004, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.5.2004

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



Baa
Воспользовался частью твоего кода.
Хотел в своей программе с его помощью узнать ширину и высоту bmpфайла
так вот pBmInfoHeader->biWidth и pBmInfoHeader->biHeight выдали мне совсем не то, что должно быть. Не подскажешь в чём тут дело.
А вообще возможно ли считывать не весь DIB, как ты это делаешь, а только его BITMAPINFOHEADER.
Спасибо за внимание.

Это сообщение отредактировал(а) oldm - 13.7.2004, 01:33
PM MAIL   Вверх
_hunter
Дата 13.7.2004, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



подскажу smile.gif -- дело в вырвнивании ( можеш почитать мою тему по этом поводу )

можно. в этом случае нужно считывать sizeof(BITMAPINFOHEADER) байт




--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
oldm
Дата 13.7.2004, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.5.2004

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



C этим вроде разобрался - спасибо hunter

Маленький вопрос по сохранению.
Сохраняю DIB созданный с помощью CreateDIBSection разрешение DIBа 24 бит/пиксел.

Код
 
HANDLE hFile = CreateFile
(FileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
  if (hFile == INVALID_HANDLE_VALUE) throw Exception("Exception");
  BITMAPFILEHEADER hdr;

  hdr.bfType = ((WORD)('M' << 8) | 'B');
  hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(bmi.bmiHeader) + height*info.bmWidthBytes;
  hdr.bfReserved1 = 0;
  hdr.bfReserved2 = 0;
  hdr.bfOffBits = (DWORD)(sizeof(hdr) + sizeof(bmi.bmiHeader));

  DWORD dwBytesWrite;
  WriteFile(hFile, &hdr, sizeof(BITMAPFILEHEADER), &dwBytesWrite, NULL);
  WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwBytesWrite, NULL);
  WriteFile(hFile, buffer, height*info.bmWidthBytes, &dwBytesWrite, NULL);

  CloseHandle(hFile);



buffer - массив битов изображения
info - структура получаемая мной сразу после создания DIBа (GetObject(bmp/*DIB тот самый*/, sizeof(BITMAP), &info)
bmi - структура BITMAPINFO.
всё это члены моего класса.

Во общем что то сохраняется, но все просмотрщики гр. файл ругаются на неизвестный формат или просто просмотр невозможен.
Подскажите где туплю.
Cтруктура BITMAPINFOHEADER заполнена так

Код
 
  bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  bmi.bmiHeader.biWidth = width;
  bmi.bmiHeader.biHeight = height;
  bmi.bmiHeader.biPlanes = 1;
  bmi.bmiHeader.biBitCount = 24;
  bmi.bmiHeader.biCompression = BI_RGB;
  bmi.bmiHeader.biSizeImage = 0;
  bmi.bmiHeader.biXPelsPerMeter = 0;
  bmi.bmiHeader.biYPelsPerMeter = 0;
  bmi.bmiHeader.biClrUsed = 0;
  bmi.bmiHeader.biClrImportant = 0;


Это сообщение отредактировал(а) oldm - 13.7.2004, 18:23
PM MAIL   Вверх
_hunter
Дата 13.7.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



попробуй в тип записать просто 0x424D ( или наоборот smile.gif )
+ возможно опять проблема с выравниванием
( для проверки открой свой файл в любом hex-просмоторщике ( far ) )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
oldm
Дата 13.7.2004, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 4.5.2004

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



Цитата(_hunter @ 13.7.2004, 18:27)
возможно опять проблема с выравниванием

Ну а какие пути её решения.
PM MAIL   Вверх
_hunter
Дата 14.7.2004, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



такие же как в моем посте smile.gif

Код
#pragma pack (push)
#pragma pack (1)
//структура
#pragma pack (pop)



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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