如何使用C#2010将图表图像复制到剪贴板?

时间:2010-01-04 23:03:20

标签: c# .net charts

我正在学习C#,因为我编写了一个与光谱仪接口的程序。我已经想出如何从光谱仪获取光谱并将其绘制在MS图表上。

如何将图表的图像复制到剪贴板中以便将其粘贴到其他程序中?

我正在使用Visual Studio C#2010。

我找到了chart.SaveImage方法,但我宁愿将图像复制到剪贴板而不必将其保存到磁盘。我还没有找到chart.CopyPicture方法。

我还想出了如何将原始数据作为字符串复制到剪贴板,然后可以将其粘贴到Excel工作表中并进行绘图,但我宁愿只复制图像本身。


添加个人资料:

我可以使用以下代码将图像复制到剪贴板:

spectrumChart2.SaveImage("Image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
Image img = Image.FromFile("Image.jpg");
System.Windows.Forms.Clipboard.SetImage(img);

当然有办法直接获取图像而不保存并首先从磁盘文件中检索它。拜托,请让我知道这是怎么做的(在我的一个同事找到这个kludge之前)!

3 个答案:

答案 0 :(得分:27)

要从图表控件获取图像,请将其保存到内存流,创建位图,然后将其发送到剪贴板:

using (MemoryStream ms = new MemoryStream())
{
    chart1.SaveImage(ms, ChartImageFormat.Bmp);
    Bitmap bm = new Bitmap(ms);
    Clipboard.SetImage(bm);
}

答案 1 :(得分:1)

使用静态方法......

Clipboard.SetImage(....);

答案 2 :(得分:0)

我通过内存流将图表图像保存为图元文件(EMF)。我想保留原始图像分辨率并保留选项以取消组合矢量图像并在PowerPoint中编辑它们。最近,我升级到一台非常高分辨率的笔记本电脑,我发现图表图像的框架空间很大。如果我将图像粘贴到PowerPoint或Word中,粘贴的图像将非常小。手动裁剪和调整大小并不令人满意,我不希望降低屏幕分辨率以使图像粘贴更大。这是我找到的解决方案(见下文)。

我正在使用VB.Net 2008,因此Chart.Clone方法不可用。我必须实现一个单独的函数来克隆图表,但是如果你有一个更新版本的Visual Studio,你可以取消注释下面的行并删除CloneMSChart函数和引用它的行。以下是我用来找到解决方案的相关网站的参考资料:

How to clone a chart

Exporting a high-resolution image

以下是复合解决方案:

“---------------------------------------------- ---------------

Public Sub CopyChartImageToClipBoard(ByVal ChartToSave As Chart)
    Dim originalSize As Size = ChartToSave.Size
    Dim screenWidth As Integer = Screen.PrimaryScreen.Bounds.Width
    Dim screenHeight As Integer = Screen.PrimaryScreen.Bounds.Height
    Dim cloneChart As New Chart

    Using ms As New IO.MemoryStream()
        Try
            'cloneChart = CType(ChartToSave.Clone, Chart)
            cloneChart = CloneMSChart(ChartToSave)
            cloneChart.Size = New Size(screenWidth, screenHeight)   ' copy a high resolution image 
            cloneChart.SaveImage(ms, System.Drawing.Imaging.ImageFormat.Png)
            ms.Seek(0, SeekOrigin.Begin)
            Using mf As New Bitmap(ms)
                Clipboard.SetImage(mf)
            End Using

        Finally
            ms.Close()
            cloneChart.Dispose()
        End Try
    End Using
End Sub

“---------------------------------------------- --------------

Public Function CloneMSChart(ByVal chart1 As Chart) As Chart
    Dim myStream As New System.IO.MemoryStream
    Dim chart2 As Chart = New Chart
    chart1.Serializer.Save(myStream)
    chart2.Serializer.Load(myStream)
    Return chart2
End Function

“---------------------------------------------- ---------