c# - example - livecharts
¿Cómo copio una imagen de gráfico en el portapapeles utilizando C#2010? (3)
Estoy guardando las imágenes del gráfico como un metarchivo (EMF) a través de un flujo de memoria. Quiero conservar la resolución de la imagen original y conservar la opción para desagrupar las imágenes vectoriales y editarlas en PowerPoint. Recientemente, actualicé a una computadora portátil de muy alta resolución y descubrí que la imagen del gráfico se estaba enmarcando con mucho espacio vacío. Si pego la imagen en PowerPoint o Word, la imagen pegada será muy pequeña. Recortar y cambiar el tamaño manualmente no es satisfactorio, y no quiero tener que bajar la resolución de mi pantalla para que las imágenes se peguen más grandes. Aquí está la solución que encontré (abajo).
Estoy usando VB.Net 2008, por lo que el método Chart.Clone no estaba disponible. Tuve que implementar una función separada para clonar el gráfico, pero si tiene una versión más reciente de Visual Studio, puede descomentar la línea a continuación y eliminar la función CloneMSChart y la línea que la referencia. Aquí hay referencias a los sitios web relevantes que utilicé para encontrar la solución:
Exportando una imagen de alta resolución
Y aquí está la solución compuesta:
''------------------------------------------------- ------------
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
''------------------------------------------------- ------
Estoy aprendiendo C # mientras escribo un programa que interactúa con un espectrómetro. He descubierto cómo obtener un espectro del espectrómetro y trazarlo en un gráfico de MS.
¿Cómo copio la imagen del gráfico en el portapapeles para que pueda pegarse en otros programas?
Estoy usando Visual Studio C # 2010.
Encontré el método chart.SaveImage, pero preferiría copiar la imagen al portapapeles en lugar de tener que guardarla en el disco. No he encontrado un método chart.CopyPicture.
También descubrí cómo copiar los datos sin procesar en el portapapeles como una cadena, que luego puede pegarse en una hoja de cálculo de Excel y trazarse, pero prefiero copiar la imagen en sí.
Datos adicionales:
Puedo copiar la imagen al portapapeles usando el siguiente código:
spectrumChart2.SaveImage("Image.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
Image img = Image.FromFile("Image.jpg");
System.Windows.Forms.Clipboard.SetImage(img);
Seguramente hay una manera de obtener la imagen directamente en el Portapapeles sin guardarla y recuperarla de un archivo de disco primero. ¡Por favor, hágame saber cómo se hace esto (antes de que uno de mis compañeros de trabajo encuentre este engaño)!
Para obtener una imagen del control de gráficos, guárdelo en el flujo de memoria, cree un mapa de bits y luego envíelo al portapapeles:
using (MemoryStream ms = new MemoryStream())
{
chart1.SaveImage(ms, ChartImageFormat.Bmp);
Bitmap bm = new Bitmap(ms);
Clipboard.SetImage(bm);
}
Usa el método estático ...
Clipboard.SetImage(....);