VTK本身并不支持中文,在实践过程中,总结了如下集中中文显示解决方案:
1.图片方案
将文字使用GDI绘制为图片,再采用VTKImageReader 读取图片,显示图片。这种方式处理不太灵活,且背景不能为透明(可能水平问题)。
主要代码如下:
- vtkImageActor imageActor = new vtkImageActor();
- vtkBMPReader m_reader = new vtkBMPReader();
- m_reader.SetFileName(Directory.GetCurrentDirectory() + "/temp.bmp");
- imageActor.SetInput(m_reader.GetOutput());
- imageActor.SetPosition(0,0,0);
- vtkRender.AddActor2D(imageActor);
2.矢量文字方案,也是网上最流行的说法,通过获取文字的矢量字型,在vtk中绘制矢量字型,主要技术要点包括:
a. 使用WinAPI获取字型数据
- [DllImport("gdi32.dll")]
- public static extern int GetGlyphOutline(IntPtr hdc, uint uChar, uint fuFormat, out GLYPHMETRICS lpgm, uint cbBuffer, IntPtr lpBuffer, ref MAT2 lpmat2);
b.解析字型数据,形成矢量数据vtkPolyData.
字型数据包括直线、也包括样条曲线,需要分别进行处理。
直线直接使用vtkPolyData进行构造,对样条曲线,需要对每一段曲线实现如下代码:
- vtkParametricSpline spline = new vtkParametricSpline();
- spline.SetPoints(inputPoints);
- spline.ClosedOff();
- vtkParametricFunctionSource splineSource = new vtkParametricFunctionSource();
- splineSource.SetParametricFunction(spline);
对获取的vtkPolyData与Spline对象,使用vtkAppendFilter进行组装,形成一个整体的vtkPolyData
3.图片转矢量的方案
对于第一种方式中的图片,需要要增强显示效果,可以对图片进行解析,构造矢量的点阵信息,再通过vtkPolyData绘制点阵信息。
步骤如下:
a . 根据图片数据,获取点阵信息。
- public static vtkPolyData Img2VtkPoints(Bitmap img)
- {
- int w = img.Width;
- int h = img.Height;
- vtkPolyData polyData = new vtkPolyData();
- vtkPoints ps = new vtkPoints();
- vtkCellArray cellAry = new vtkCellArray();
- int iCount = 0;
- for (int y = 0; y < h; y++)
- {
- byte[] scan = new byte[(w + 7) / 8];
- for (int x = 0; x < w; x++)
- {
- Color c = img.GetPixel(x, y);
- if (c.GetBrightness() >= 0.5)
- {
- ps.InsertNextPoint(x, h - y, 0);
- cellAry.InsertNextCell(1);
- cellAry.InsertCellPoint(iCount++);
- }
- }
- }
- polyData.SetPoints(ps);
- polyData.SetVerts(cellAry);
- return polyData;
- }
b.绘制点阵信息。
以上三种方法,是实践过程中摸索出来的,各有优劣,分享给大家。