2010-01-04 2 views
15

Sto imparando C# mentre scrivo un programma che si interfaccia con uno spettrometro. Ho capito come ottenere uno spettro dallo spettrometro e tracciarlo su un grafico MS.Come faccio a copiare un'immagine di un grafico negli appunti usando C# 2010?

Come si copia l'immagine del grafico negli Appunti in modo che possa essere incollata in altri programmi?

sto usando Visual Studio C# 2010.

ho trovato il metodo chart.SaveImage, ma vorrei davvero piuttosto copiare l'immagine negli appunti, piuttosto che dover salvarlo su disco. Non ho trovato un metodo chart.CopyPicture.

Ho anche capito come copiare i dati grezzi negli appunti come una stringa, che può quindi essere incollata in un foglio di lavoro Excel e tracciata, ma preferirei semplicemente copiare l'immagine stessa.


dati aggiuntivi:

sono in grado di copiare l'immagine negli appunti utilizzando il seguente codice:

spectrumChart2.SaveImage("Image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 
Image img = Image.FromFile("Image.jpg"); 
System.Windows.Forms.Clipboard.SetImage(img); 

Sicuramente c'è modo per ottenere l'immagine direttamente Appunti senza salvare e recuperare prima da un file su disco. Per favore, fammi sapere come si fa (prima che uno dei miei colleghi trovi questo kludge)!

risposta

23

per ottenere l'immagine dal controllo grafico, salvarlo al flusso di memoria, creare bitmap e quindi inviarlo negli appunti:

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

Ha funzionato! Grazie mille per l'aiuto! – Curt

+0

Piccoli problemi: le etichette non verranno visualizzate in questo modo. L'area delle etichette sarà dipinta di nero puro che sembra brutta da morire. Ho giocato un po 'e ho trovato un po' di cambiare. Modificato la tua risposta, dai un'occhiata! Non l'ho mai saputo prima, in aumento. – C4u

1

Utilizzare il metodo statico ...

Clipboard.SetImage(....); 
+0

Come ottengo l'immagine dal controllo grafico? – Curt

0

Mi risparmio le immagini del grafico come metafile (EMF) attraverso un flusso di memoria. Voglio mantenere la risoluzione dell'immagine originale e preservare l'opzione per separare le immagini vettoriali e modificarle in PowerPoint. Di recente, ho eseguito l'aggiornamento a un laptop ad altissima risoluzione e ho scoperto che l'immagine del grafico veniva incorniciata con molto spazio vuoto. Se si incolla l'immagine in PowerPoint o Word, l'immagine incollata sarà molto piccola. Il ritaglio e il ridimensionamento manuale non sono soddisfacenti e non voglio dover eseguire il downgrade della risoluzione dello schermo per fare in modo che le immagini si incollino più in alto. Ecco la soluzione che ho trovato (sotto).

Sto utilizzando VB.Net 2008, quindi il metodo Chart.Clone non era disponibile. Ho dovuto implementare una funzione separata per clonare il grafico, ma se si dispone di una versione più recente di Visual Studio, è possibile decommentare la riga sottostante ed eliminare la funzione CloneMSChart e la linea di riferimento.Qui ci sono i riferimenti ai siti web pertinenti che ho usato per trovare la soluzione:

How to clone a chart

Exporting a high-resolution image

e qui è la soluzione composita:

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

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 

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

+0

Oops ... questo salva un PNG, non un metafile. Questo risolve il problema del ridimensionamento, ma non consente di separare e modificare come file vettoriale. –