C# InkPicture控件-如何将墨水和图像保存到图像文件

C# InkPicture控件-如何将墨水和图像保存到图像文件,c#,image,background,save,microsoft.ink,C#,Image,Background,Save,Microsoft.ink,我看过一些文章演示了墨水可以与背景图像一起保存,这样墨水就可以叠加到图像上,然后保存为单个图像文件。但是,不幸的是,我所看到的文章并没有详细介绍如何做到这一点。 我可以使用以下语句轻松保存背景图像: axInkPicture1.Picture.Save(@"\path\to\file.gif"); …但背景图像上没有墨迹覆盖 我不知道有什么直接的方法来保存墨水,但我现在就是这样做的: string tempPath = Path.GetTempPath(); string tempFile =

我看过一些文章演示了墨水可以与背景图像一起保存,这样墨水就可以叠加到图像上,然后保存为单个图像文件。但是,不幸的是,我所看到的文章并没有详细介绍如何做到这一点。 我可以使用以下语句轻松保存背景图像:

axInkPicture1.Picture.Save(@"\path\to\file.gif");
…但背景图像上没有墨迹覆盖

我不知道有什么直接的方法来保存墨水,但我现在就是这样做的:

string tempPath = Path.GetTempPath();
string tempFile = tempPath + @"\file.gif";
// save to a temp file
if (axInkPicture1.Ink.Strokes.Count > 0)
    {
        byte[] bytes = (byte[])axInkPicture1.Ink.Save(InkPersistenceFormat.IPF_GIF, InkPersistenceCompressionMode.IPCM_Default);

        using (MemoryStream ms = new MemoryStream(bytes))
        {
            using (Bitmap gif = new Bitmap(ms))
            {
                gif.Save(tempFile);
            }
        }

    }
这样可以保存墨水,但没有背景图像

如何将墨水和图像保存到单个文件中

任何帮助或指示都将不胜感激

编辑 这是我到目前为止尝试过的其他方法

 InkRectangle inkBox = axInkPicture1.Ink.GetBoundingBox();
        byte[] gifbits = (byte[])axInkPicture1.Ink.Save(InkPersistenceFormat.IPF_GIF, InkPersistenceCompressionMode.IPCM_Default);
        using (System.IO.MemoryStream buffer = new System.IO.MemoryStream(gifbits))
        using (var inkImage = new Bitmap(buffer))
        using (var picture = new Bitmap(axInkPicture1.Picture))
        using (var g = Graphics.FromImage(picture))
        {
            g.DrawImage(inkImage, new Rectangle(inkBox.Left, inkBox.Right, axInkPicture1.Picture.Width, axInkPicture1.Height));
            picture.Save(tempFile, System.Drawing.Imaging.ImageFormat.Gif);
        }
…但我还是没什么运气。这将仅保存背景图片,而不保存墨水。知道我做错了什么吗


提前感谢

所以。。。。在经历了无数次的头痛和咬牙切齿之后,我终于想出了解决问题的办法,虽然可能不是我所期望的解决办法,也可能不是最好的解决办法,但它确实有效。我是c和.net的新手,所以如果我在这里说了什么愚蠢的话,请随时纠正我

我发现我上面编辑的代码实际上在工作,我只是看不到墨水,因为它在矩形的边界之外。显然,使用GetBoundingBox方法获取的矩形会提供与像素坐标大不相同的墨水空间坐标

考虑到这一点,我的下一个目标是使用inkSpaceToPixels方法将inkSpace坐标转换为像素坐标。我为此挣扎了一段时间,但始终不知道如何使用InkPicture或axInkPicture的activex版本来实现这一点。它需要一些hdcDisplay的手柄,我无法完全控制它

最后,我使用了Microsoft.Ink.dll中的.net版本Microsoft.Ink。我开始使用activeX版本的唯一原因是,由于某种原因,我无法在我的开发机器上安装Windows Tablet PC SDK。它一直抱怨我需要WinXP平板电脑操作系统来安装它。我发现我可以在另一台Win7电脑上安装它,然后从那台电脑上复制.dll文件

所以,这里是最终版本,现在正在工作。。。唷

        //set the temporary file paths
        string tempPath = Path.GetTempPath();
        string tempFile = tempPath + @"tmpFile.png";

        //get the bounding box and reference point for the ink strokes (in inkspace coordinates!)
        Rectangle inkBox = inkPicture1.Ink.GetBoundingBox();
        Point point = new Point(inkBox.Left, inkBox.Top);
        MessageBox.Show(point.X.ToString() + ", " + point.Y.ToString());//"before" coordinates

        // Convert inkspace coordinates to pixel coordinates using Renderer
        Graphics tempGraphics = CreateGraphics();
        Microsoft.Ink.Renderer inkRenderer = new Renderer();
        inkRenderer.InkSpaceToPixel(tempGraphics, ref point);;
        MessageBox.Show(point.X.ToString() + ", " + point.Y.ToString());//"after" coordinates
        // Clean up
        tempGraphics.Dispose();

        // save the ink and background image to a temp file
        if (inkPicture1.Ink.Strokes.Count > 0)
        {
            byte[] bytes = inkPicture1.Ink.Save(PersistenceFormat.Gif, CompressionMode.NoCompression);
            using (MemoryStream ms = new MemoryStream(bytes))
            {
                using (Bitmap gif = new Bitmap(ms))
                using (var bmp = new Bitmap(inkPicture1.BackgroundImage))
                using (var g = Graphics.FromImage(bmp))
                {
                    g.DrawImage(gif, new Rectangle(point.X, point.Y, gif.Width, gif.Height));
                    bmp.Save(tempFile, System.Drawing.Imaging.ImageFormat.Png);

                }
            }
        }

对于冗长的解释,我感到很抱歉,但我觉得仅仅在没有充分解释的情况下发布解决方案会留下太多悬而未决的问题…

我想我没有足够的50%的声誉来发表评论,所以我会用这条评论回答其他可能在谷歌搜索后登陆这里的人,就像我一样:

这很有帮助。我翻译成VB,它工作了

经过一番周旋后,我发现DLL位于:

C:\Program Files x86\Common Files\Microsoft Shared\Ink\Microsoft.Ink.dll

显然,我不是唯一一个在定位DLL时遇到问题的人,因为有很多关于如何获取DLL的google条目——很多都是错误的,大多数都不是这么简单

如果您刚开始使用签名捕获,请记住将背景图像添加到控件中,否则将失败:


发布此解决方案后不久,使用bmp=New BitmapInkPicture1.BackgroundImage

时,我在Tablet PC SDK中使用的Microsoft.Ink.dll开始出现问题。在HansPassant的帮助下,我最终找到了您在上面指出的.dll的正确路径。这是你的电话号码