Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с BMP, Загрузить его в масив 
V
    Опции темы
shara
Дата 12.11.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



народ, работаю в Microsoft Visual C++ 6.0 и надо загрузить BMPшник в обыкновенный двухмерный масив, для дальнейвей обработки изображения. нашел на сайте описание структуры BMPфайла, но с файлами работать не умею... подскажите функцию, которая загружает BMPшник в масив. если можно то и выводит его на экран.

P.S. 
картинка - по сути отсканированный график (чернобелое или с градацией серого изображение)


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Romikgy
Дата 12.11.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Код

The GetDIBits function retrieves the bits of the specified bitmap and copies them into a buffer using the specified format. 

не ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 12.11.2006, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Для загрузки из файла и создания виндового объекта можно иcпользовать LoadImage().
А имея Хендл объекта можно уже юзать как GetDIBits, так и любые другие функции. Единственное условие. В памяти битмап должен быть представлен как DIB иначе данных не добится.


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

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

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


Freedom in me
**


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

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



 smile а покажите пожалуйста на примере, как это делается. Я помню, как-то ковырял, у меня не вышло нифига.


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
shara
Дата 15.11.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



э, чуточку подробнее. 
обязательно ли работать виндовсовскими функциями?
и что такое DIB?



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Alexeis
Дата 15.11.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(shara @  15.11.2006,  21:28 Найти цитируемый пост)
обязательно ли работать виндовсовскими функциями?

Нет, конечно, я вот на делфе писал как это делать полностью ручками. 

А вот и выдержка из моей статейки 
Аппаратно-зависимые и аппаратно-независимые битовые карты (Device-Dependenent  and Device-Independent bitmap - DDB и DIB)

Цитата

   Аппаратно-зависимые или DDB битмапы используются windows для хранения изображений в памяти различных графических устройств (в частности в видеопамяти). Фактически такой битмап представляет собой урезанную версию аппаратно-независимого. Его данные формируются таким образом, чтобы соответствовать конкретному графическому режиму, кроме того, такой битмап содержит упрощенный заголовок. Например, для старого 16 цветного EGA/VGA видеоадаптера, такой битмап будет представлять собой 3 цветовые матрицы (для каждого из цветов), аппаратно-независимый битмап будет содержать всего одну матрицу разрядностью 4бита на пиксель.
Поскольку структура DDB битмапа меняется в зависимости от устройства к устройству, то он, как правило, создается прямо в памяти и не сохраняется в файл. Для сохранения в файл DDB конвертируется в DIB (т.е. аппаратно-независимый). В настоящее время графические ускорители оптимизируются под работу с DIB - универсальность в ущерб производительности (на самом деле эти потери незначительны). DDB битмап далее не будет описываться. Часто в литературе говорят битмап а подразумевают DIB (и наоборот) это не является грубой ошибкой.

http://forum.vingrad.ru/index.php?showtopic=94227


Цитата(EvgenZ @  12.11.2006,  22:53 Найти цитируемый пост)
 а покажите пожалуйста на примере, как это делается

Гм. попробую сейчас код из делфи в Visual C++ перебабахать

Это сообщение отредактировал(а) alexeis1 - 15.11.2006, 22:38


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

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

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


Амеба
Group Icon


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

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



Вот оно получилось
Код

void CBitmaptestDlg::OnOK() 
{
    
HBITMAP bmp = NULL;

//Грузим из файла в DDB
  bmp = (HBITMAP)LoadImage(0, "phoenix.bmp", 
                            IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE|LR_LOADFROMFILE);

HDC bDC = CreateCompatibleDC(0); //создаем DC для нашего битмапа
  SelectObject(bDC, bmp);                 //Назначаем DC для нашего битмапа

tagBITMAP bmInfo;                            

  GetObject(bmp, sizeof(bmInfo), &bmInfo); //Получаем инфу о DDB

BITMAPINFO DIBInfo;
  memset(&DIBInfo, 0, sizeof(DIBInfo)); //Готовим структуру для создания DIB.

  DIBInfo.bmiHeader.biWidth         = bmInfo.bmWidth;
  DIBInfo.bmiHeader.biHeight        = bmInfo.bmHeight;
  DIBInfo.bmiHeader.biPlanes        = 1;      // всегда 1
  DIBInfo.bmiHeader.biCompression   = BI_RGB; // без компрессии
  DIBInfo.bmiHeader.biBitCount      = 24;     // три байта на пиксель
  DIBInfo.bmiHeader.biSize          = sizeof(DIBInfo.bmiHeader);
  DIBInfo.bmiHeader.biXPelsPerMeter = 2834;   // пикселей на метр, гор.    
  DIBInfo.bmiHeader.biYPelsPerMeter = 2834;   // пикселей на метр, верт. 

BYTE* pBits  = NULL;     //тут будет растр DIB 
HBITMAP dib  = NULL;    //Хендл DIB вдруг понадобится :)

//Создаем пустой DIB в памяти на основе установленых параметров.
dib = CreateDIBSection(bDC, &DIBInfo, DIB_RGB_COLORS, (VOID**)&pBits, 0, 0);

//Конвертируем DDB в DIB указанного формата.
  GetDIBits(bDC, bmp, 0, bmInfo.bmHeight - 1, pBits, &DIBInfo, DIB_RGB_COLORS);
}

//Усе теперь функция GetDIBits, по адресу pBits записала растр. 


Ой чуть не забыл
Вот так рисуем на диалоге
Код

CDC *Dest = this->GetDC();

  BitBlt(Dest->m_hDC, 20, 20, bmInfo.bmWidth, bmInfo.bmHeight, bDC, 0, 0, SRCCOPY);


Это сообщение отредактировал(а) alexeis1 - 16.11.2006, 00:55


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

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

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


Опытный
**


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

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



Огромное спасибо за инфу!!!!!!!!!!!!!!!!
вот закачал, шас буду разбераться. smile 


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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