Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2013, 18:45   #1
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию создать простейший битмап

Как создать простейший битмап из массива пикселей??

Получается только вывести картинку из файла в консоль...
а как сделать сам битмап и отобразить его???
Код:
#include "stdafx.h"

#include <windows.h>
#include <tchar.h>

/*
int main()
{
	return 0;
}
*/


int _tmain(int argc, _TCHAR* argv[])
{
    printf("starting\n");

	HDC hdc = CreateCompatibleDC(NULL);
	HBITMAP cross = (HBITMAP)LoadImage(NULL, _T("C:\\home\\cross.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
		// http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx
    printf("cross red\n");

	SelectObject(hdc, cross);
		// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162957%28v=vs.85%29.aspx
	int i_count=0;
	
	printf("starting loop\n");

	while (1)
	{

		HDC hdc_x = GetDC(HWND_DESKTOP);
		int ret=BitBlt(hdc_x,400,200,48,48,hdc,0,0,SRCCOPY);	 
//		BitBlt(hdc_x,488,359,48,48,hdc,0,0,SRCCOPY);	 
			// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183370%28v=vs.85%29.aspx

		printf(" %d\n", ret);
		
		ReleaseDC(HWND_DESKTOP,hdc_x); 
		
		printf(" looping : %d %d \n", i_count, ret);
		Sleep(500);
		i_count++;
	}

	return 0;
}
Очень прошу помощи тех, кто разбирается.
hunter03 вне форума Ответить с цитированием
Старый 07.08.2013, 20:23   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Ну так смотрите какой вызов что возвращает - коды ошибок и тд.
waleri вне форума Ответить с цитированием
Старый 07.08.2013, 22:16   #3
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

ну этот код рабочий, он загружает картинку и отображает в консоли.
а вот как создать битмап из массива пикселей - не представляю даже...знаю что нужно использовать функцию SelectObject, CreateBitmap...но не представляю как(((
никак не могу разобраться с этим всем(((
hunter03 вне форума Ответить с цитированием
Старый 07.08.2013, 22:35   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Заполняете BITMAP структуру, там есть указатель на массив, где лежат пиксели. Далее, CreateBitmapIndirect() ну и далее по коду...
waleri вне форума Ответить с цитированием
Старый 07.08.2013, 22:48   #5
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Цитата:
там есть указатель на массив
не понял как это?
например у меня двумерный массив с значением цвета?
как это использовать??
hunter03 вне форума Ответить с цитированием
Старый 08.08.2013, 09:19   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Прочитайте описание структуры BITMAP. В этой структуре описывается все - размеры, массив с данными...
waleri вне форума Ответить с цитированием
Старый 08.08.2013, 10:51   #7
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

Вроде разобрался, создал битмап, вывел на контекст, когда указую размеры в функции
Код:
BitBlt(hdc_x,300,300,64,64,hdc,0,0,SRCCOPY);
- все хорошо работает
Но если же по У в этой функции поставить больше 64 - отображается не корректно.
Код:
BitBlt(hdc_x,300,300,90,90,hdc,0,0,SRCCOPY);
- по оси Х растягивает нормально, а по оси У - нет(
в чем может быть проблема?

Вот полный код:
Код:
#include "stdafx.h"

#include <windows.h>
#include <tchar.h>

/*
int main()
{
	return 0;
}
*/


int _tmain(int argc, _TCHAR* argv[])
{
    printf("starting\n");
	
	HDC hdc = CreateCompatibleDC(NULL);

	BITMAPINFO bmi;
	BITMAPINFOHEADER bmheader;
	/*bmheader.biSize=14 + 40 + 324*256*4;
	bmheader.biWidth=324;
	bmheader.biHeight=256;
	bmheader.biPlanes=1;
	bmheader.biSizeImage=324*256;
	bmheader.biBitCount=32;
	bmheader.biCompression=0;
	bmheader.biXPelsPerMeter=0;
	bmheader.biYPelsPerMeter=0;*/
    ZeroMemory(&bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biHeight = 256;
    bmi.bmiHeader.biWidth = 324;
    bmi.bmiHeader.biPlanes = 3;
	bmi.bmiHeader.biXPelsPerMeter=0;
	bmi.bmiHeader.biYPelsPerMeter=0;

HDC dc = CreateCompatibleDC(NULL);
 
char Frame[(324*256)*4];

for (int mass=0; mass<324*256; mass++ ){
Frame[mass]=160;
										}

for (int height=0; height < 256; height++){
for (int index=height*324; index < (height+1)*324; index++ ){
Frame[index]=(char)height;
}
}

	HBITMAP cross = CreateBitmap(324,256,1,32,Frame);
		// http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx
    printf("cross red\n");

	SelectObject(hdc, cross);
		// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162957%28v=vs.85%29.aspx
	int i_count=0;
	
	printf("starting loop\n");

	while (1)
	{

		HDC hdc_x = GetDC(HWND_DESKTOP);
		int ret=BitBlt(hdc_x,300,300,90,90,hdc,0,0,SRCCOPY);	 
//			 
			// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183370%28v=vs.85%29.aspx

		//printf(" %d\n", ret);
		
		ReleaseDC(HWND_DESKTOP,hdc_x); 
		
	//	printf(" looping : %d %d \n", i_count, ret);
		Sleep(500);
		i_count++;
	}

	return 0;
}
hunter03 вне форума Ответить с цитированием
Старый 08.08.2013, 11:09   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

BitBlt размер не меняет. Смотрите StretchBlt()
waleri вне форума Ответить с цитированием
Старый 08.08.2013, 11:25   #9
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

StretchBlt - не помогает( изображение создается...но ниже 64 пиксела все заливается каким то цветом...как решить - не пойму
hunter03 вне форума Ответить с цитированием
Старый 08.08.2013, 14:33   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

SetStretchBltMode(hDC, HALFTONE)
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести на экран сформированный битмап hunter03 Общие вопросы C/C++ 3 07.08.2013 17:11
Сохранить битмап в поток System::IO::Stream bananasus Visual C++ 2 02.08.2012 22:43
Не рисуется битмап Jugger Win Api 2 03.04.2012 15:15
Битмап konstahntin Win Api 1 17.05.2011 19:42
Как нарисовать на КАНВАС-е БИТМАП. Altera Общие вопросы Delphi 3 09.03.2008 15:41