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

16

我正在学习使用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);

肯定有一种方法可以直接从剪贴板获取图像,而不必先保存并从磁盘文件中检索它。请告诉我如何做到这一点(在我的其中一位同事发现这个丑陋的解决方案之前,请务必让我知道)!

3个回答

27

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

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

小问题:标签不会以这种方式显示。标签区域将被涂成纯黑色,看起来非常丑陋。我尝试了一下,找到了一些可以改变的地方。编辑了你的答案,看看吧!以前不知道这种方法,点赞了。 - C4d

1

使用静态方法...

Clipboard.SetImage(....);

我该如何从图表控件中获取图像? - Curt

1

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

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

如何克隆图表

导出高分辨率图像

这就是综合解决方案:

'-------------------------------------------------------------

(这是一个分割线)
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

'-------------------------------------------------------

'-------------------------------------------------------


糟糕..这保存的是PNG文件,而不是元文件。这解决了调整大小的问题,但它不允许将其作为矢量文件进行取消分组和编辑。 - Robert Cody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接