一直在博客园上查找资料,却好久没有写博客了。今天需要将文本转化为图片,在网上找了很久都没有一个很好的办法,终于想到一个比较好的注意,记录下来,与大家分享。
问题:当我们需要将文本文件在别的地方显示的时候,可能会是是一件很容易的事情,但是如果要保证格式完全一样,可能就会变成一件很艰难的事情。比如原本在word或excel里编辑好的一段文本,在网页上显示出来,要求排版,字体大小,表格。。。完全跟原来一样,就会变得很困难。
解决方案:就是把编辑好的文本变成图片。
但是怎样才能把文本变成图片,而原来的样式保持不变呢,文本不难,但难度在于保留样式。
解决思路:我发现在word里复制文本,在[画图](windows附件里都有的程序)里粘贴,就变成图片了,而且满足要求。就是说[画图]程序已经有这项功能,只要调用就可以。
这样,解决过程就变成:文本放到word里--->word里复制--->在[画图]里粘贴--->在[画图]里复制--->再从剪切板里取出图片。
word是比较容易操控的,但[画图]程序没有现成接口,操控起来比较困难一些,需要用到windows的API函数,向[画图]程序发送消息达到操控目的。
用C#写的代码如下,如有更好方法,请指教:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)] private static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam); [DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)] private static extern void SetForegroundWindow(IntPtr hwnd); [DllImport("user32.dll", EntryPoint = "GetMenu")] public static extern int GetMenu(int hwnd ); [DllImport("user32.dll", EntryPoint = "GetSubMenu")] public static extern int GetSubMenu(int hMenu,int nPos); [DllImport("user32.dll", EntryPoint = "GetMenuItemID")] public static extern int GetMenuItemID(int hMenu,int nPos); [DllImport("user32.dll", EntryPoint = "PostMessage")] public static extern int PostMessage(int hwnd,int wMsg,int wParam,int lParam); private const int WM_COMMAND = 0x111; private Image PasteImage() { //让仅一个画图程序在后台运行,多的杀掉,没有就打开 //画图程序在进程中的名字是mspaint,没有后缀exe System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName(@"mspaint"); if (process.Count() != 1) { foreach (System.Diagnostics.Process p in process) { p.Kill(); } ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = @"mspaint.exe"; startInfo.CreateNoWindow = false; startInfo.WindowStyle = ProcessWindowStyle.Hidden; System.Diagnostics.Process txt = Process.Start(startInfo); //等一会,睡个觉 Thread.Sleep(1000); } //查找<画图>的句柄 //新打开的<画图>窗口名为"未命名 - 画图",中间有空格 IntPtr hwndCalc = FindWindow(null, "未命名 - 画图"); if (hwndCalc != IntPtr.Zero) { //获取菜单 int gm = GetMenu(hwndCalc.ToInt32()); gm = GetSubMenu(gm, 1); //粘贴 int id = GetMenuItemID(gm, 5); PostMessage(hwndCalc.ToInt32(), WM_COMMAND, id, 0); //复制 id = GetMenuItemID(gm, 4); PostMessage(hwndCalc.ToInt32(), WM_COMMAND, id, 0); } //睡个觉等一会,否则可能系统还没准备好,然后从剪切板取出 Thread.Sleep(1000); IDataObject data = System.Windows.Forms.Clipboard.GetDataObject(); return (Image)data.GetData(typeof(Bitmap)); }