【问题标题】:How do I copy a chart image to the clipboard using C#2010?如何使用 C#2010 将图表图像复制到剪贴板?
【发布时间】:2011-01-01 10:55:10
【问题描述】:

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

当然有办法直接从剪贴板中获取图像,而无需先从磁盘文件中保存和检索它。请告诉我这是如何做到的(在我的一位同事发现这个杂物之前)!

【问题讨论】:

    标签: c# .net charts


    【解决方案1】:

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

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

    【讨论】:

    • 小问题:标签不会这样显示。标签区域将被漆成纯黑色,看起来很难看。我玩了一下,发现有点改变。编辑你的答案,看看吧!以前不知道这种方式,赞成。
    【解决方案2】:

    使用静态方法...

    Clipboard.SetImage(....);
    

    【讨论】:

    • 如何从图表控件中获取图像?
    【解决方案3】:

    我正在通过内存流将图表图像保存为元文件 (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
    

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

    【讨论】:

    • 哎呀..这会保存 PNG,而不是元文件。这解决了调整大小的问题,但它不允许作为矢量文件取消分组和编辑。
    猜你喜欢
    • 2023-03-11
    • 2014-09-27
    • 1970-01-01
    • 2011-04-19
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多