Как скопировать изображение диаграммы в буфер обмена с помощью С# 2010?

Я изучаю С#, когда пишу программу, которая взаимодействует со спектрометром. Я выяснил, как получить спектр из спектрометра и построить его на графике MS.

Как скопировать изображение диаграммы в буфер обмена так, чтобы его можно было вставить в другие программы?

Я использую Visual Studio С# 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)!

Ответы

Ответ 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 и строку, ссылающуюся на нее. Вот ссылки на соответствующие сайты, которые я использовал для поиска решения:

Как клонировать диаграмму

Экспорт изображения с высоким разрешением

и вот составное решение:

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

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

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