一直在博客园上查找资料,却好久没有写博客了。今天需要将文本转化为图片,在网上找了很久都没有一个很好的办法,终于想到一个比较好的注意,记录下来,与大家分享。

问题:当我们需要将文本文件在别的地方显示的时候,可能会是是一件很容易的事情,但是如果要保证格式完全一样,可能就会变成一件很艰难的事情。比如原本在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));            
        }

 

版权声明:本文为eyye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/eyye/archive/2012/04/24/2467397.html