一直在博客园上查找资料,却好久没有写博客了。今天需要将文本转化为图片,在网上找了很久都没有一个很好的办法,终于想到一个比较好的注意,记录下来,与大家分享。
问题:当我们需要将文本文件在别的地方显示的时候,可能会是是一件很容易的事情,但是如果要保证格式完全一样,可能就会变成一件很艰难的事情。比如原本在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));
}