Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 05:54
Оценка:
Есть файл bmp (256 градаций серого для начала). Из него читаются данные. Генерится структура BITMAP.
Для вывода на экран, как я поняла, нужен CBitmap.
Делаю вот что (в OnDraw), pbmp — это BITMAP*:

CDC memDC;
memDC.CreateCompatibleDC(pDC);
bmpImage.CreateBitmapIndirect(pbmp);
memDC.SelectObject(&bmpImage);
pDC->BitBlt(0,0,pbmp->bmWidth,pbmp->bmHeight,&memDC,0,0,SRCCOPY);

Валится на CreateBitmapIndirect. Если вместо него использовать CreateBitmap, то не валится, но если потом посмотреть свойства bmpImage (путем mpImage.GetBitmap(pbmp), то указатель на данные (pbmp->bmBits) равен NULL.

Объясните мне пожалуйста, где я что не так делаю?
Re: Вывод битмапа на экран
От: Yaumen  
Дата: 10.09.03 06:00
Оценка:
Здравствуйте, Bonnie, Вы писали:

B>Есть файл bmp (256 градаций серого для начала). Из него читаются данные. Генерится структура BITMAP.

B>Для вывода на экран, как я поняла, нужен CBitmap.
B>Делаю вот что (в OnDraw), pbmp — это BITMAP*:

B>CDC memDC;

B>memDC.CreateCompatibleDC(pDC);
B>bmpImage.CreateBitmapIndirect(pbmp);
B>memDC.SelectObject(&bmpImage);
pDC->>BitBlt(0,0,pbmp->bmWidth,pbmp->bmHeight,&memDC,0,0,SRCCOPY);

B>Валится на CreateBitmapIndirect. Если вместо него использовать CreateBitmap, то не валится, но если потом посмотреть свойства bmpImage (путем mpImage.GetBitmap(pbmp), то указатель на данные (pbmp->bmBits) равен NULL.


B>Объясните мне пожалуйста, где я что не так делаю?


А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?
Re[2]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 06:43
Оценка:
Здравствуйте, Yaumen, Вы писали:

Y>А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?


К сожалению, это критично. Считанную картинку надо будет преобразовывать с помощью неких алгоритмов и каждый промежуточный этап выводить на экран.
То есть смысл не в том, чтобы файл показать, а чтобы показывать картинку, с которой что-то уже сделали. В реальном времени.
Re[3]: Вывод битмапа на экран
От: Yaumen  
Дата: 10.09.03 06:57
Оценка:
Здравствуйте, Bonnie, Вы писали:

B>Здравствуйте, Yaumen, Вы писали:


Y>>А не лучше ли вместо создания битмапа загружать его с помощью LoadBitmap или LoadImage?


B>К сожалению, это критично. Считанную картинку надо будет преобразовывать с помощью неких алгоритмов и каждый промежуточный этап выводить на экран.

B>То есть смысл не в том, чтобы файл показать, а чтобы показывать картинку, с которой что-то уже сделали. В реальном времени.

Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.
Re[4]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 07:31
Оценка:
Здравствуйте, Yaumen, Вы писали:

Y>Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.


Погоди-погоди, ты не понимаешь, кажется =)
Проблема в том, что не создается нужный экземпляр CBitmap, в котороый должна запихнуться картинка.
Сама картинка (структура BITMAP и привязанный к ней массивчик точек) созданы отдельно и не пересоздаются каждый раз.
И потом, мне же менять ее надо будет! 25 раз в секунду. Ну или раз в секунду, как получится.
Или погоди... ты предлагаешь и CBitmap создать вместе с ними с привязать намертво, чтобы изменились данные — изменился битмап? Так?
Но он же и в первый раз не создается.
Re[5]: Вывод битмапа на экран
От: Yaumen  
Дата: 10.09.03 08:06
Оценка:
Здравствуйте, Bonnie, Вы писали:

B>Здравствуйте, Yaumen, Вы писали:


Y>>Так загрузи эту битмапку один раз, например в конструкторе, и храни ее пока живет приложение, по необходимости издеваясь над ее содержимым. И незачем каждый раз при выводе создавать новую битмапку. Выбрал существующую, нарисовал и все.


B>Погоди-погоди, ты не понимаешь, кажется =)

B>Проблема в том, что не создается нужный экземпляр CBitmap, в котороый должна запихнуться картинка.
B>Сама картинка (структура BITMAP и привязанный к ней массивчик точек) созданы отдельно и не пересоздаются каждый раз.
B>И потом, мне же менять ее надо будет! 25 раз в секунду. Ну или раз в секунду, как получится.
B>Или погоди... ты предлагаешь и CBitmap создать вместе с ними с привязать намертво, чтобы изменились данные — изменился битмап? Так?
B>Но он же и в первый раз не создается.

В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет
Re[6]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 08:11
Оценка:
Здравствуйте, Yaumen, Вы писали:

Y>В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет


Можно код? И по вывод на экран.
DIB, как я понимаю, это структура файла bmp вживую?
Re[7]: Вывод битмапа на экран
От: Yaumen  
Дата: 10.09.03 08:44
Оценка:
Здравствуйте, Bonnie, Вы писали:

B>Здравствуйте, Yaumen, Вы писали:


Y>>В таком случае, вообще проще создать один раз DIB и отказаться от структуры BITMAP и связанным с ним массивом точек. DIB тебе в любой момент и массив точек (даже цветных — COLORREF) и если надо HBITMAP. Поэтому вообще ничего больше пересоздавать не надо будет


B>Можно код? И по вывод на экран.

B>DIB, как я понимаю, это структура файла bmp вживую?

Эта проблема много где описана. Вот пример кода который создает DIB из битмапа. Битмап же ты умеешь загружать!?

//Creates Source DIB
LPBITMAPINFO lpbiSrc;
// Fill in the BITMAPINFOHEADER
lpbiSrc = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
lpbiSrc->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbiSrc->bmiHeader.biWidth = dwWidth; //ширина картинки
lpbiSrc->bmiHeader.biHeight = dwHeight; //высота картинки
lpbiSrc->bmiHeader.biPlanes = 1;
lpbiSrc->bmiHeader.biBitCount = 32; //количество цветов
lpbiSrc->bmiHeader.biCompression = BI_RGB;
lpbiSrc->bmiHeader.biSizeImage = dwWidth * dwHeight; //размер картинки ширина * высоту
lpbiSrc->bmiHeader.biXPelsPerMeter = 0;
lpbiSrc->bmiHeader.biYPelsPerMeter = 0;
lpbiSrc->bmiHeader.biClrUsed = 0;
lpbiSrc->bmiHeader.biClrImportant = 0;
    
COLORREF* pSrcBits = NULL;
HBITMAP hSrcDib = CreateDIBSection (
    hSrcDC, lpbiSrc, DIB_RGB_COLORS, (void **)&pSrcBits,
    NULL, NULL);


На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt
Re[8]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 09:06
Оценка:
Здравствуйте, Yaumen, Вы писали:

Y>Эта проблема много где описана. Вот пример кода который создает DIB из битмапа. Битмап же ты умеешь загружать!?


Битмап я умею загружать =) Я только с графикой под Windows работать не умею.

Y>
Y>//Creates Source DIB
Y>LPBITMAPINFO lpbiSrc;
Y>// Fill in the BITMAPINFOHEADER
Y>lpbiSrc = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
Y>lpbiSrc->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
Y>lpbiSrc->bmiHeader.biWidth = dwWidth; //ширина картинки
Y>lpbiSrc->bmiHeader.biHeight = dwHeight; //высота картинки
Y>lpbiSrc->bmiHeader.biPlanes = 1;
Y>lpbiSrc->bmiHeader.biBitCount = 32; //количество цветов
Y>lpbiSrc->bmiHeader.biCompression = BI_RGB;
Y>lpbiSrc->bmiHeader.biSizeImage = dwWidth * dwHeight; //размер картинки ширина * высоту
Y>lpbiSrc->bmiHeader.biXPelsPerMeter = 0;
Y>lpbiSrc->bmiHeader.biYPelsPerMeter = 0;
Y>lpbiSrc->bmiHeader.biClrUsed = 0;
Y>lpbiSrc->bmiHeader.biClrImportant = 0;
    
Y>COLORREF* pSrcBits = NULL;
Y>HBITMAP hSrcDib = CreateDIBSection (
Y>    hSrcDC, lpbiSrc, DIB_RGB_COLORS, (void **)&pSrcBits,
Y>    NULL, NULL);
Y>


Y>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt


Прям вот так вот и выбирать с помощью SelectObject?
Или ::SelectObject?
Re[8]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 09:15
Оценка:
Здравствуйте, Yaumen, Вы писали:

Y>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt


Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?
Re[9]: Вывод битмапа на экран
От: Yaumen  
Дата: 10.09.03 09:25
Оценка:
Здравствуйте, Bonnie, Вы писали:

B>Здравствуйте, Yaumen, Вы писали:


Y>>На выходе у тебя указатель *pSrcBits указывает на массив точек в памяти, а hSrcDib — собственно DIB, который ты можешь выбирать в контексте и копировать с помощью BitBlt или StretchBlt


B>Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?


К вопросу о количестве бит на цвет смотри спецификацию на BITMAPINFOHEADER:
biBitCount
Specifies the number of bits per pixel. Some compression formats need this information to properly decode the colors in the pixel.


Что касается рисования, то лучше использовать ::SelectObject(), хотя никто не запрещает написать SelectObject(FromHandle(hSrcDib)).

Кстати в приведенном коде я забыл указать назначение hSrcDC — это контекст в котором выбран HBITMAP, который запихивается в DIB
Re[10]: Вывод битмапа на экран
От: Bonnie Россия http://elenchi.boom.ru
Дата: 10.09.03 09:46
Оценка:
Здравствуйте, Yaumen, Вы писали:

B>>Да, и еще вопрос: это про 32 бит на цвет, а если 8 бит? Где там таблица цветов?


Y>К вопросу о количестве бит на цвет смотри спецификацию на BITMAPINFOHEADER:

Y>biBitCount
Y>Specifies the number of bits per pixel. Some compression formats need this information to properly decode the colors in the pixel.


Я спрашивала про таблицу цветов... 8 бит это ж не только цветной, но и градации серого... Откуда цвета-то сами берутся?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.