Как скопировать изображение диаграммы в буфер обмена с помощью С# 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);

Конечно, есть способ получить изображение непосредственно из буфера обмена без предварительного сохранения и извлечения его из файла на диске. Пожалуйста, дайте мне знать, как это делается (до того, как один из моих коллег найдет этот кладж)!


person Curt    schedule 04.01.2010    source источник


Ответы (3)


Чтобы получить изображение из элемента управления диаграммой, сохраните его в потоке памяти, создайте растровое изображение и затем отправьте его в буфер обмена:

using (MemoryStream ms = new MemoryStream())
{
    chart1.SaveImage(ms, ChartImageFormat.Bmp);
    Bitmap bm = new Bitmap(ms);
    Clipboard.SetImage(bm);
}
person pascon    schedule 24.02.2010
comment
Маленькие проблемы: метки не будут отображаться таким образом. Область метки будет окрашена в чистый черный цвет, что выглядит чертовски уродливо. Я немного поиграл и нашел немного, чтобы изменить. Отредактировал свой ответ, проверьте это! Не знал этого раньше, проголосовал. - person C4d; 27.11.2014

Используйте статический метод...

Clipboard.SetImage(....);
person Tim Jarvis    schedule 04.01.2010
comment
Как получить изображение из элемента управления диаграммой? - person Curt; 05.01.2010

Я сохраняю изображения диаграмм в виде метафайла (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

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

person Robert Cody    schedule 28.05.2017
comment
Упс... это сохраняет PNG, а не метафайл. Это решает проблему изменения размера, но не позволяет разгруппировать и редактировать векторный файл. - person Robert Cody; 29.05.2017