最近在用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提取点阵信息了,于是特来求助
新手菜鸟,还望各位不吝赐教

解决方案 »

  1.   


    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);
    }
    }
    }
      

  2.   


    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);
           }
     }你大约是只需要看这些就可以了。
      

  3.   

    楼上给的是c的代码啊,我用的是c#,会有些不太一样的地方,不知道能否说明下c#下是如何提取的
      

  4.   

    难道不是一样的吗?无外乎就是数据类型做了改变,其他的就是一个数组和API了。