Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gidm
0 / 0 / 0
Регистрация: 02.06.2008
Сообщений: 3
#1

Нужно сохранить нарисованное мышкой на поверхности DirectX в BMP файл - C++

22.06.2010, 07:53. Просмотров 898. Ответов 0
Метки нет (Все метки)

Здравствуйте! Помогите с проблемой сохранения картинки нарисованной на поверхности.
Задача состоит в следующем: есть поверхность pImage типа IDirectDrawSurface7, на ней мышкой рисуем так:
Код
void MouseMove(DWORD x, DWORD y, DWORD button)
{
	if ((button == MOUSE_DOWN_LEFT) && ((nOldMouseX != x) || (nOldMouseY != y))) 
	{		
		HDC hdc;
		pImage->GetDC(&hdc);
		if (hdc)
		{
			if (sPainting == PEN)
			{
				SelectObject(hdc, CreatePen(PS_SOLID, 0, RGB(128, 128, 0)));
				MoveToEx(hdc, nOldMouseX-xlCanvas, nOldMouseY-ylCanvas, NULL);
				LineTo(hdc, x-xlCanvas, y-ylCanvas);
			}
			pImage->ReleaseDC(hdc);
		}
		else
			WriteLog('Can`t get DC');

		nOldMouseX = x;
		nOldMouseY = y;
	}
}
Функция работает и на поверхности предварительно залитой белым цветом рисуется черным цветом все что мышкой водится. Но вот когда я хочу сохранить это художестов в виде Bitmap с помощью следующей функции:
[code]
void SaveBitmap()
{
HFILE hf = NULL;
OFSTRUCT OfStruct;
HDC hdc = NULL;
HDC compatibleDC = NULL;
BITMAP bmp;
HBITMAP hbm = NULL;
LPBYTE lpBits = NULL;
PBITMAPINFO pbi = NULL;
PBITMAPINFOHEADER pbih = NULL;
BITMAPFILEHEADER bfh;
UINT cb;
BYTE *hp;

pImage->GetDC(&hdc);
if (hdc != NULL)
{
if((compatibleDC = CreateCompatibleDC(hdc))!= NULL)
if((hbm = CreateCompatibleBitmap(hdc, widthCanvas, heightCanvas)) != NULL)
{
SelectObject(compatibleDC, hbm);
if (GetObject(hbm, sizeof(BITMAP), (LPSTR)&bmp))
{
WriteLog('%d %d %d %d %d %d',
bmp.bmType,
bmp.bmBits,
bmp.bmPlanes,
bmp.bmWidth,
bmp.bmHeight,
bmp.bmPlanes * bmp.bmBitsPixel);
if ((WORD)(bmp.bmPlanes * bmp.bmBitsPixel) == (WORD)24
|| (WORD)(bmp.bmPlanes * bmp.bmBitsPixel) == (WORD)32)
{
if ((pbi = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER))) != NULL)
{
pbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbi->bmiHeader.biWidth = bmp.bmWidth;
pbi->bmiHeader.biHeight = bmp.bmHeight;
pbi->bmiHeader.biPlanes = bmp.bmPlanes;
pbi->bmiHeader.biBitCount = bmp.bmBitsPixel;
pbi->bmiHeader.biCompression = BI_RGB;
pbi->bmiHeader.biSizeImage =
((pbi->bmiHeader.biWidth * pbi->bmiHeader.biBitCount +
31) & ~31) / 8 * pbi->bmiHeader.biHeight;
pbi->bmiHeader.biClrImportant = 0;
pbih = (PBITMAPINFOHEADER)pbi;
lpBits = (LPBYTE)GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
if (!lpBits)
WriteLog('Can`t global alloc memory lpBits');
if (!GetDIBits(hdc, hbm, 0, (WORD)pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS))
WriteLog('Can`t get dib bits');

if ((hf = OpenFile('1.bmp', &OfStruct, OF_CREATE | OF_READWRITE)) != HFILE_ERROR)
{
bfh.bfType = 0x4D42;
bfh.bfSize = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + pbi->bmiHeader.biSizeImage;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
if ((cb = _lwrite(hf, (LPSTR)&bfh, sizeof(BITMAPFILEHEADER))) != HFILE_ERROR)
{
WriteLog('%d', cb);
if ((cb = _lwrite(hf, (LPSTR)&(pbi->bmiHeader), sizeof(BITMAPINFOHEADER))) != HFILE_ERROR)
{
WriteLog('%d', cb);
//hp = lpBits;
if ((cb = _lwrite(hf, (LPSTR)lpBits, pbi->bmiHeader.biSizeImage))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2010, 07:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно сохранить нарисованное мышкой на поверхности DirectX в BMP файл (C++):

Нужно сохранить результат в png, a не в bmp - C++
Вот мой код, сохраняющий рисунок(фиолетовый квадрат) в bmp#include <string> #include <vector> #include <cmath> #include <limits> ...

Сделать скриншот экрана и сохранить в файл формата jpg или bmp - C++
Приветствую, товарищи. Необходимо сделать скриншот экрана и сохранить в файл формата jpg или bmp. У кого какие предложения? Мой...

Нужно создать новый вектор и сохранить его в файл - C++
Добрый день Нужно создать вектор, занести туда некоторые значения и сохранить их в файл. Вот, что я сделал vector <string>...

Ffmpeg сохранить AVFrame в .bmp или .jpg - C++
Контекст конвертирования создаю так: imgconvertCtx = sws_getCachedContext( imgconvertCtx, codecCtx -> width, codecCtx -> height, ...

Как сохранить нарисованное изображение в формате bmp - C#
Моя программа рисует круговые диаграммы. Есть поля для ввода названия диаграммы/количества секторов в ней/данных диаграммы(название...

Сохранить нарисованное в файл - Turbo Pascal
Задача состоит в следующем , нужен так сказать аналог принт скрина в Турбо паскале . т.е. например пишется программа , точнее рисуется...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2010, 07:53
Привет! Вот еще темы с ответами:

Сохранить снимок экрана в bmp-файл - C#
мне нужно программно заскринить экран(не весь) и сохранить в 1.bmp , причём от должен быть RGB и по 8 бит на канал делал так, но не...

Сохранить 3 картинки в один bmp файл - Visual Basic
Короче у меня есть 3 картинки на форме. Распологаются так: 1 картинка ...

Как сохранить содержимое canvas в *.bmp файл - C# WPF
Подскажите, пожалуйста, как сохранить содержимое canvas в bmp файл? я понимаю, что для этого нужно получить Image c canvasа, но как?

Как сохранить картинку из буфера обмена в файл bmp - C++ WinAPI
Ребята, как с помощью WinAPI сохранить картинку из буфера обмена CF_DIB, в файл .bmp Совсем запутался.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru