我正在学习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之前)!
答案 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函数和引用它的行。以下是我用来找到解决方案的相关网站的参考资料:
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
“---------------------------------------------- ---------