Текст на битмапе
От: Henry Twilight Россия  
Дата: 22.08.05 12:39
Оценка:
Столкнулся со следующей проблемой: Есть некий текст, из этого текста нужно получить:
а) файл bmp с этим текстом;
б) нечто пригодное для дальнейшего вывода на экран (скажем HBITMAP).

Несколько непонятно взаимодействие хэндла HBITMAP и контекста девайса HDC. Каким образом сделать так, чтобы текст, напечатанный с помощью контекста ( TextOut(hdc...) ), был в дальнейшем сохранен в битмапе?
Re: Текст на битмапе
От: Gleb Alexeev  
Дата: 22.08.05 16:01
Оценка:
Здравствуйте, Henry Twilight, Вы писали:

HT>Несколько непонятно взаимодействие хэндла HBITMAP и контекста девайса HDC. Каким образом сделать так, чтобы текст, напечатанный с помощью контекста ( TextOut(hdc...) ), был в дальнейшем сохранен в битмапе?

См. примеры по CreateCompatibleDC.
Re[2]: Текст на битмапе
От: ZAMUNDA Земля для жалоб и предложений
Дата: 22.08.05 16:57
Оценка:
Здравствуйте, Gleb Alexeev, Вы писали:

GA>Здравствуйте, Henry Twilight, Вы писали:


HT>>Несколько непонятно взаимодействие хэндла HBITMAP и контекста девайса HDC.

Надеюсь, что буду прав, если скажу что их взаимодействие никаму не должно быть известно ибо оно сокрыто в дебрях кишок мастдая. Снаружи только HBITMAP, который вы можете выбрать на HDC и с него WinAPI'ями получить раааазличную инфу (например DIB) и/или на ём че-нить нарисовать..

HT>>Каким образом сделать так, чтобы текст, напечатанный с помощью контекста ( TextOut(hdc...) ), был в дальнейшем сохранен в битмапе?

GA>См. примеры по CreateCompatibleDC.
По-моему проще использовать GetDIBits, ибо после получения DIB'а достаточно будеть только сформировать BITMAPFILEHEADER и приспокойненько записать всё в бинарный файл.

PS: если в примерах CreateCompatibleDC это и делается, то приношу свои извинения.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: Текст на битмапе
От: MicroCephalis Россия  
Дата: 22.08.05 20:04
Оценка: +1
Здравствуйте, Henry Twilight, Вы писали:

HT>Каким образом сделать так, чтобы текст, напечатанный с помощью контекста ( TextOut(hdc...) ), был в дальнейшем сохранен в битмапе?


HDC hDesktopDC = ::GetDC(::GetDesktopWindow());
HDC hMemDC = ::CreateCompatibleDC(hDesktopDC);

HBITMAP hTargetBmp = ::CreateCompatibleBitmap(hDC, Размер_Х, Размер_Y) ;
HBITMAP hOldBmp = ::SelectObject(hMemDC, (HGDIOBJ)hTargetBmp);

// следует рисование на hMemDC

::SelectObject(hMemDC, (HGDIOBJ)hOldBmp);

::DeleteDC(hMemDC);
::ReleaseDC(hDesktopDC);


Вроде так.

По выполнении этого то, что было нарисовано, остается в hTargetBmp. Когда нужна в hTargetBmp отпадет, надо однако не забыть его DeleteObject'нуть.
Re: Текст на битмапе
От: dibil  
Дата: 23.08.05 04:45
Оценка:
Здравствуйте, Henry Twilight, Вы писали:

HT>Столкнулся со следующей проблемой: Есть некий текст, из этого текста нужно получить:

HT> а) файл bmp с этим текстом;
HT> б) нечто пригодное для дальнейшего вывода на экран (скажем HBITMAP).

HT>Несколько непонятно взаимодействие хэндла HBITMAP и контекста девайса HDC. Каким образом сделать так, чтобы текст, напечатанный с помощью контекста ( TextOut(hdc...) ), был в дальнейшем сохранен в битмапе?


Пример из одной моей проги, не обращай внимание на некоторые переменные и возвращаемые ошибки

//создание битмепа
// Выровнять на границу DWORD
UINT Width=Rect.bitmap.right-Rect.bitmap.left;
Width*=3;
if(Width%4)
Width+=4-(Width%4);

// Создать буфер
BYTE *buf=new BYTE [(Rect.bitmap.bottom-Rect.bitmap.top)*Width];
ZeroMemory(buf,(Rect.bitmap.bottom-Rect.bitmap.top)*Width);


BITMAPINFO Bmi;
ZeroMemory(&Bmi,sizeof(BITMAPINFO));
Bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
Bmi.bmiHeader.biWidth=Rect.bitmap.right-Rect.bitmap.left;
Bmi.bmiHeader.biHeight=Rect.bitmap.bottom-Rect.bitmap.top;
Bmi.bmiHeader.biPlanes=1;
Bmi.bmiHeader.biBitCount=24;
Bmi.bmiHeader.biSizeImage=(Rect.bitmap.bottom-Rect.bitmap.top)*Width;


HBitmap=CreateDIBitmap(GetDC(GetForegroundWindow()),&Bmi.bmiHeader,CBM_INIT,buf,&Bmi,DIB_RGB_COLORS);

delete [] buf;

if (HBitmap==NULL) return ERROR_NOCREATEBITMAP;

//Получение HDC

SelectObject(dc,HBitmap);


//вывод текста на Bitmap

HFONT font=CreateFont( Rect.SizeFont, 0, 0, 0,
FW_NORMAL, FALSE, FALSE, FALSE,
RUSSIAN_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
VARIABLE_PITCH,
"arial");

SelectObject(dc,font);
SetBkMode(dc,TRANSPARENT);
SetTextColor(dc,Rect.TextColor);
GetTextExtentPoint32(dc,Rect.TextX,lstrlen(Rect.TextX),&s);
TextOut(dc,Rect.DrawArea.right-10-s.cx,Round(rt)+5,Rect.TextX,lstrlen(Rect.TextX));

создание bmp:

void CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header
LPBYTE lpBits; // memory pointer
DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp;

pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits)
return;

// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.
if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
DIB_RGB_COLORS))
{
return;
}

// Create the .BMP file.
hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);
if (hf == INVALID_HANDLE_VALUE)
return;
hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
return;
}

// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL)))
return;

// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;
hp = lpBits;
if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
return;

// Close the .BMP file.
if (!CloseHandle(hf))
return;

// Free memory.
GlobalFree((HGLOBAL)lpBits);
}
Re[3]: Текст на битмапе
От: Gleb Alexeev  
Дата: 23.08.05 07:48
Оценка:
Здравствуйте, ZAMUNDA, Вы писали:


ZAM>По-моему проще использовать GetDIBits, ибо после получения DIB'а достаточно будеть только сформировать BITMAPFILEHEADER и приспокойненько записать всё в бинарный файл.

Но сначала нужно нарисовать, что делается путем CreateCompatibleDC/CreateCompatibleBitmap/SelectObject(dc, bitmap).

ZAM>PS: если в примерах CreateCompatibleDC это и делается, то приношу свои извинения.

Принимается
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.