일반적으로 전자 시스템의 정보 표시에는 16×16(32바이트) 도트 매트릭스 글꼴, 예를 들어 Win98에서 16×16(32바이트) 글꼴 파일인 Chs16.fon과 같은 글꼴이 사용됩니다. 이 파일에서 fon을 추출하는 방법은 다음과 같습니다: 한자의 내부 코드는 2바이트이며, A와 b로 설정됩니다. A의 크기는 0xa1에서 0xfe 사이여야 하며, 영역 코드는 qu=a-0xa0, 비트 코드는 wei=b-0xa0, 글꼴 파일에서 한자 fon의 위치는 오프셋 =((qu-1)×94+(Wei-1))×32입니다.
이 글은 에서는 주로 윈도우의 벡터 폰트에서 폰트를 추출하는 방법을 소개합니다. 이 방법은 한자 표시 문제를 해결하기 위해 마이크로 컨트롤러 시스템 설계에 성공적으로 적용되었습니다. 실제 응용 프로그램에서는 Win32 API 함수를 직접 호출하여 추출해야 하는 한자의 텍스트를 비트맵으로 변환하여 한자의 도트 매트릭스를 구현함으로써 글꼴을 추출할 수 있습니다.
1 글꼴 설정
먼저 글꼴을 설정해야 합니다.Win32 SDK는 일반적인 글꼴 선택 대화 상자를 제공하며, 반환값이 부울인 ChooseFont 함수를 호출하기만 하면 됩니다. 구체적인 정의는 boolchoosefont(lpchoosefont lpcf)입니다. 이 함수를 호출하면 글꼴 선택 대화 상자가 나타나고 원하는 글꼴, 글리프, 글꼴 크기 및 기타 매개 변수를 선택할 수 있습니다. 선택 후 글꼴 선택 대화 상자에서 확인을 클릭하면 함수는 0이 아닌 값을 반환하고 취소를 클릭하면 0 값을 반환합니다. 이 함수를 호출하기 전에 두 가지 변수를 정의해야 합니다.
SelectFont cf;
LOGFONT logfont
CHOOSEFONT는 ChooseFont 함수가 글꼴 선택 대화 상자를 초기화하는 데 사용하는 다양한 정보를 포함하는 12개 이상의 필드가 있는 구조입니다.
LOGFONT는 또한 로그폰트 역시 글꼴의 다양한 속성을 정의하는 14개의 필드가 있는 구조체입니다. 확인을 클릭하면 시스템은 선택한 글꼴 정보를 LOGFONT 구조를 통해 반환합니다. 반환된 글꼴 정보는 CHOOSEFONT 구조체의 lpLogFont 필드에 지정된 LOGFONT 구조체에 저장됩니다.
다음은 ChooseFont 함수를 호출하는 코드입니다:
//초기화 CHOOSEFONT
cf . l structsize = sizeof(choose font);
cf.hwndOwner = hwnd//현재 창의 핸들
cf.hDC = NULL
cf.lpLogFont = & amplogfont//시스템이 반환하는 글꼴에 대한 정보가 저장되어 있습니다.
cf . ipointsize = 0;
CF . Flags = CF _ 초기 로그 글꼴 | CF _
화면 글꼴 | CF _ 효과
cf . RGB 색 = 0;
cf . lcustdata = 0;
cf.lpfnHook = NULL
cf.lpTemplateName = NULL
cf.hInstance = NULL
cf.lpszStyle = NULL
cf . nfonttype = 0;
cf . NSI Zemin = 0;
cf . nsizemax = 0;
SelectFont(& ampcf); //이 함수를 호출하면 글꼴 선택을 위한 일반 대화 상자가 나타납니다.
선택 글꼴(&; Cf) 함수가 0이 아닌 값을 반환하면 글꼴이 선택된 것입니다. 선택한 글꼴은 로그폰트 변수에 저장됩니다. 다음으로 할 일은 선택한 로그 글꼴을 만드는 것입니다. CreateFontIndirect 함수를 호출하여 논리 글꼴을 만들 수 있습니다. CreateFontIndirect 함수는 LOGFONT 구조체에 대한 포인터를 받는데, 구체적으로 hfont CreateFontIndirect(constlogfont? Lplf)로 정의됩니다. 코드는 다음과 같습니다.
HFONT hNewFont = CreateFontIndirect(& amp; log font);
이 시점까지 글꼴 생성이 완료되었습니다. 생성된 논리 글꼴은 SeletObject 함수를 직접 호출하여 디바이스 설명 테이블에서 선택할 수 있습니다. 비트맵 변환에서 SelectObject 함수는 메모리 디바이스 설명 테이블에 hNewFont를 선택하는 데 사용됩니다. 단, 메모리 누수를 방지하기 위해 프로그램 종료 전에 DeleteObject(hNewFont) 함수를 호출하여 글꼴 핸들을 해제해야 한다는 점에 유의해야 합니다. 다음은 텍스트를 비트맵으로 변환하는 구체적인 구현 과정을 설명합니다.
2 비트맵 변환
다음은 "ting" 글꼴을 추출하는 예제입니다. 먼저 다음 변수를 정의해야 합니다.
static WCHAR Hanzi[] = " Ting ";
static HBITMAP hBitmap
static int cxBitmap, cyBitmap
static HDC hdc, hdcMem
PAINTSTRUCT ps
Size;
CxBitmap과 cybermap은 생성할 비트맵의 크기로, GetTextExtentPoint32 함수로 얻은 텍스트의 크기, 즉 여기서 "팅"이라는 단어의 크기와 동일합니다. 여기서 "팅"이라는 단어의 크기입니다.
다음은 중국어 텍스트를 비트맵으로 변환하는 구체적인 방법이며, 일반적으로 WM_PAINT 메시지에서 처리됩니다.
Case WM_PAINT:
hdc = begin paint(hwnd & amp; PS); //현재 창의 장치 핸들을 가져옵니다.
hdc mem = CreateCompatileDC(hdc); //메모리 장치 설명 테이블을 생성합니다.
SelectObject(hdcMem, hNewFont); //S 생성된 폰트를 메모리 장치 설명 테이블에 선택합니다.
GetTextExtendPoint32W(hdcMem, Hanzi, 1, & amp size);
//표시할 텍스트의 크기를 가져옵니다.
cxBitmap = size.cx
cyBitmap = size.cy
hbit map = createcompatiletibitmap(hdc, cxBitmap,
cyBitmap);//비트맵 핸들 생성
SelectObject(hdcMem, hbit map); //S 메모리 장치 설명 테이블에 비트맵을 선택합니다.
TextOutW(hdcMem, 0, 0, hanzi, 1); //D 메모리 장치 설명 테이블의 비트맵에 hanzi를 그립니다.
BitBlt(hdc, 0, 0, cxBitmap, cyBitmap, hdcMem, 0, 0, SRC-
Copy); //D창의 클라이언트 영역에 비트맵을 표시하고 디스플레이를 관찰합니다.
이제까지 한자의 도트 매트릭스 과정이 완료되었으며 다음 단계는 글꼴을 추출하는 것입니다.
3 글꼴 추출
글꼴을 추출하는 데는 COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)로 정의된 GetPixel 함수가 사용됩니다. 이 함수는 nXPos와 nYPos로 지정된 포인트의 RGB 값인 COLORREF 타입의 값을 반환합니다. 비트맵의 크기는 이전 글에서 결정했습니다. 이 범위 내에서 각 픽셀 포인트는 한 번 스캔되고 반환된 RGB 값을 기반으로 비트맵 코드가 생성됩니다. Windows 벡터 글꼴은 회색조이므로 포인트가 유효한지 확인하기 위해 적절한 RGB 값이 선택됩니다. 흰색 RGB 값은 FFFFFFFH, 짙은 회색은 808080H, 검은색은 000000H이며, 판단의 기준으로 짙은 회색을 선택할 수 있습니다. 함수의 반환값이 808080H보다 작으면 유효한 점으로 간주합니다. 다음은 첫 번째 줄의 첫 번째 점에서 바이트 단위로 저장하고 스캔한 글꼴을 추출하는 함수입니다.
Quiet Ink [2048]; //이 배열에 그리드 코드가 있습니다.
void GetZimo(HDC hdc, int nXPos, int nYPos)
{
int Hang, Lie/// Hang은 스캔한 행의 수입니다.
int temp, I, j, g;
Hang = nYPos
Lie = nXPos
if(Lie % 8==0 ){
Lie = Lie/8;//Bitmap 폭은 8의 정수 배수이므로
//Storing 폰트는 Lie/8 바이트만 필요합니다! .
temp = 0;
}
그렇지 않으면 {
temp = Lie % 8;
Lie = Lie/8+1;//비트맵의 폭이 8의 정수 배수가 아닙니다.
// 따라서 글꼴을 저장하려면 Lie/8+1 바이트만 필요합니다.
}
memset(ink, 0, 2048); //S폰트 배열을 모두 0으로 설정합니다.
for(I = 0; I & lt hang; i++){
for(j = 0; j & lt lie; j++){
If ((temp! = 0) & amp; & amp(j==Lie-1) ){
for(k = 0; k & lt temperature; k++){
g=( int)GetPixel(hdc, j*8+k, I);
if(g & lt; 0x00808080)
Murray[i*Lie+j]+=(unsigned
char)pow(2, 7-k);
}
}
기타{
< p>for(k = 0; k & lt8;k++){g=(int)GetPixel(hdc, j*8+k, I);
if(g & lt; 0x00808080)
Murray[i*Lie+j]+=(unsigned
char)pow(2, 7-k);
}
}
}
WM_PAINT 메시지에서 GetZimo(hdcMem, cxBit-
Map, cyBitmap)를 호출하여 한자의 글꼴을 가져옵니다. 프로그램이 끝나면 몇 가지 마무리 작업도 수행해야 합니다.
delete object(hbit map); // 사용 후 장치 설명을 게시해야 합니다.
//메모리 누수를 방지하기 위한 테이블 및 비트맵 핸들
delete object(hNewFont);
DeleteDC(hdc mem);
Facepaint(hwnd & amp; PS);
Returns 0;//WM_PAINT 메시지 처리 후 리턴합니다.
4가지 출력 결과
"꽤"라는 단어를 예로 들어 글꼴 선택 대화 상자를 띄운 후, 새 노래 본문에 대한 글꼴 선택, 일반에 대한 글꼴 선택, 작은 두 개의 글꼴 크기 선택. 행 = 24, 거짓말 = 3, 72바이트의 저장. 글꼴은 00H, 00H, 00H, 00H, 00H, 03H, 00H, 04H, 01H, 80H, 04H, 01H, 0CH, 04H, 3EH, F0H, 0CH, 00H, 7H. 18H, 8FH, F0H, 10H, 90H, 04H, 11H, BFH, FEH, 11H, 20H, 04H, 31H. 60H,08H,21H,40H,18H,65438그림 1과 같이 종이에 정확히 "亭"자에 해당하는 도트 행렬 코드를 그립니다. cxBitmap과 cyBitmap을 통해 "ting"의 도트 행렬 크기는 24×24임을 알 수 있습니다.
5 결론
텍스트-비트맵 방법을 사용하면 더 이상 단일 글꼴에 국한되지 않는 Windows의 풍부한 글꼴 라이브러리에서 다양한 글꼴을 추출할 수 있으므로 전자 디스플레이 시스템의 디자인을 풍부하게 할 수 있습니다. 도트 매트릭스 글꼴에서 글꼴을 추출하는 경우 몇 가지 단점이 있는데, 가장 중요한 것은 선택할 수 있는 글꼴이 너무 적다는 것입니다. 또한 이 논문에서 소개한 방법을 사용하면 간단한 이미지 도트 매트릭스를 추출할 수 있어 전자 디스플레이 시스템의 설계를 풍부하게 할 수 있습니다.
다른 사람의 공간에서 가져온 글인데 읽을 수 없습니다. 도움이 되었으면 좋겠습니다.