最近在用c#做有关字模的东西时遇到些问题,搜索很久发现很少有c#调用GetGlyphOutline的例子
Font font = new Font("宋体", 16);
char c = '啊';GLYPHMETRICS metrics = new GLYPHMETRICS();MAT2 matrix = new MAT2();
matrix.eM11.value = 1;
matrix.eM12.value = 0;
matrix.eM21.value = 0;
matrix.eM22.value = 1;Bitmap b = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(b);
IntPtr hdc = g.GetHdc();
IntPtr prev = SelectObject(hdc, font.ToHfont());int bufferSize = (int)GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, 0, IntPtr.Zero, ref matrix);
IntPtr buffer = Marshal.AllocHGlobal(bufferSize);uint ret = GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, (uint)bufferSize, buffer, ref matrix);
c#对GetGlyphOutline的调用为
[DllImport("gdi32.dll")]
public static extern uint GetGlyphOutline(IntPtr hdc, uint uChar, uint uFormat,
out GLYPHMETRICS lpgm, uint cbBuffer, IntPtr lpvBuffer, ref MAT2 lpmat2);
程序中第三个参数uFormat为1,即是GGO_BITMAP的值
我在第二次调用GetGlyphOutline方法后,不知道该如何从lpvBuffer提取点阵信息了,于是特来求助
新手菜鸟,还望各位不吝赐教
Font font = new Font("宋体", 16);
char c = '啊';GLYPHMETRICS metrics = new GLYPHMETRICS();MAT2 matrix = new MAT2();
matrix.eM11.value = 1;
matrix.eM12.value = 0;
matrix.eM21.value = 0;
matrix.eM22.value = 1;Bitmap b = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(b);
IntPtr hdc = g.GetHdc();
IntPtr prev = SelectObject(hdc, font.ToHfont());int bufferSize = (int)GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, 0, IntPtr.Zero, ref matrix);
IntPtr buffer = Marshal.AllocHGlobal(bufferSize);uint ret = GetGlyphOutline(hdc, (uint)c, (uint)1, out metrics, (uint)bufferSize, buffer, ref matrix);
c#对GetGlyphOutline的调用为
[DllImport("gdi32.dll")]
public static extern uint GetGlyphOutline(IntPtr hdc, uint uChar, uint uFormat,
out GLYPHMETRICS lpgm, uint cbBuffer, IntPtr lpvBuffer, ref MAT2 lpmat2);
程序中第三个参数uFormat为1,即是GGO_BITMAP的值
我在第二次调用GetGlyphOutline方法后,不知道该如何从lpvBuffer提取点阵信息了,于是特来求助
新手菜鸟,还望各位不吝赐教
CString strTemp = strValue;
strTemp.TrimLeft();
strTemp.TrimRight();//去掉字符串两遍的空格
strTemp = DBCTOSBC(strTemp);//全部转换为全角字符
GLYPHMETRICS lpgm;
MAT2 mat2;
SetMat(&mat2);
UINT ch;
CClientDC DC(this);
DC.SelectObject(&font);
intPixel =strTemp.GetLength()/2*PixelWidth;
if(intPixel == 0 )return;
if(strTemp.GetLength() == 0)return;
CodeArray = new int [intPixel*PixelHeight];
memset(CodeArray,0,intPixel*PixelHeight); for (int m = 0; m < strTemp.GetLength(); m+=2)
{
int th = strTemp.GetAt(m);
int tl = strTemp.GetAt(m + 1);
ch = ((th & 0x00ff)<<8) + (tl & 0x00ff);
DWORD dwNeedSize = DC.GetGlyphOutline(ch,GGO_BITMAP,&lpgm,0,NULL,&mat2);
if (dwNeedSize > 0 && dwNeedSize < 0xFFFF)
{
LPBYTE lpBuf = (LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwNeedSize);
if (lpBuf)
{
DC.GetGlyphOutline(ch,GGO_BITMAP,&lpgm,dwNeedSize,lpBuf,&mat2);
//计算图形每行占用的字节数。
int nByteCount = ((lpgm.gmBlackBoxX +31) >> 5) << 2;
//显示每行图形的数据。
for (int i = 0; i < (int)lpgm.gmBlackBoxY; i++)
{
int cuIndex = 0;
for (int j = 0; j < (int)nByteCount; j++)
{
BYTE btCode = lpBuf[i* nByteCount + j];
//按字节输出每点的数据。
for (int k = 0; k < 8 && cuIndex < PixelWidth; k++,cuIndex++)
{
if (btCode & (0x80>>k))
{
CodeArray[(m/2*PixelWidth +cuIndex) * PixelHeight + PixelHeight - lpgm.gmBlackBoxY + i] = 1;
}else
{
CodeArray[(m/2*PixelWidth +cuIndex) * PixelHeight + PixelHeight - lpgm.gmBlackBoxY + i] = 0;
}
}
}
}
HeapFree(GetProcessHeap(),0,lpBuf);
}
}
}
DWORD dwNeedSize = DC.GetGlyphOutline(ch,GGO_BITMAP,&lpgm,0,NULL,&mat2);//得到所需要分配的空间大小
if (dwNeedSize > 0 && dwNeedSize < 0xFFFF)
{
LPBYTE lpBuf = (LPBYTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,dwNeedSize);//分配空间
if (lpBuf)
{
DC.GetGlyphOutline(ch,GGO_BITMAP,&lpgm,dwNeedSize,lpBuf,&mat2);//得到图像的缓冲
//计算图形每行占用的字节数。
int nByteCount = ((lpgm.gmBlackBoxX +31) >> 5) << 2;
//显示每行图形的数据。
for (int i = 0; i < (int)lpgm.gmBlackBoxY; i++)
{
int cuIndex = 0;
for (int j = 0; j < (int)nByteCount; j++)
{
BYTE btCode = lpBuf[i* nByteCount + j];
//按字节输出每点的数据。
for (int k = 0; k < 8 && cuIndex < PixelWidth; k++,cuIndex++)
{
if (btCode & (0x80>>k))
{
//输入框中有黑色点的地方
}else
{
//输入框中白色区域
}
}
}
}
HeapFree(GetProcessHeap(),0,lpBuf);
}
}你大约是只需要看这些就可以了。