Что нового

[Элементы GUI] как сделать экспорт графика в файл (jpg?), без снятия скриншота

zero_1632

Новичок
Сообщения
15
Репутация
0
Есть массив данных, можно даже представить - из sql.
Конкретнее - сбор данных о температуре с датчика temper за сутки.
Задача - сделать график, в любом формате(jpg, png), и послать его по почте.
Собственно, сделано сейчас - каждый раз опрашивая датчик на экран выводится точка, потом снимается скриншот.
Хотелось бы уйти от этого, этот график вообще выводить на экран не нужно.
Можно ли это сделать, и как?

Есть же в юниксах rrdtool, cacti, которые могут делать png...
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Вот сделал на основе этого:
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>

HotKeySet('{ESC}', 'Terminate')
Dim $aTemp[10] = [15,12,8,25,8,10,14,18,19,22]

_GDIPlus_Startup()
$hBitmap = _WinAPI_CreateSolidBitmap(0, 0xFFFFFF, 900, 900)
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
_WinAPI_DeleteObject($hBitmap)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
$hPenBlueThin = _GDIPlus_PenCreate(0xFF0000FF) ; ручка для синей линии
$hPenRedBold = _GDIPlus_PenCreate(0xFFFF0000, 2) ; ручка для красной точки

For $i = 0 To UBound($aTemp) - 2
	_DrawLine($i*50, $aTemp[$i], ($i + 1)*50, $aTemp[$i + 1]) ; рисуем
Next
_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & '\1.png')

Func _DrawLine($iStartX, $iStartY, $iEndX, $iEndY)
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $iStartX - 2, $iStartY - 2, 4, 4, $hPenRedBold) ; точка СТАРТ
    _GDIPlus_GraphicsDrawEllipse($hGraphic, $iEndX - 2, $iEndY - 2, 4, 4, $hPenRedBold) ; точка ФИНИШ
    _GDIPlus_GraphicsDrawLine($hGraphic, $iStartX, $iStartY, $iEndX, $iEndY, $hPenBlueThin) ; линия отрезка
EndFunc   ;==>_DrawLine

_GDIPlus_PenDispose($hPenBlueThin)
_GDIPlus_PenDispose($hPenRedBold)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()

Func Terminate()
    Exit
EndFunc   ;==>Terminate
 
Автор
Z

zero_1632

Новичок
Сообщения
15
Репутация
0
Вот мой код.(часть, все могу привести по желанию - там идет опрос датчика и разная мутотень)
Проблема в том, что чтобы сохранить в jpg, необходимо вывести на экран график.
Иначе снимается скриншот той части экрана, где он должен быть.
А я хотел бы вообще без промежуточного построения графика сделать, его тупо надо отправлять по email.

Используется библиотека GraphGDIPlus

Код:
Func _Draw_Graph($current_temp)
    _GraphGDIPlus_Set_PenColor($Graph,0xFF325D87)
    _GraphGDIPlus_Set_PenSize($Graph,1)
	_GraphGDIPlus_Plot_Point($Graph,(@Hour + (@MIN*100/6000)),$current_temp)
    _GraphGDIPlus_Refresh($Graph)
EndFunc

Func _WriteJPG()

	MsgBox (4096,"","test")
	If $gui_show = 0 Then
		GUISetState(@SW_SHOW, $GUI)
		$gui_show = 1
		_GraphGDIPlus_Refresh($Graph)
		_GraphGDIPlus_SaveImage(@ScriptDir & "\" & @MDAY & "_" & @MON & "_" & @YEAR  &".jpg" ,$GUI)
		GUISetState(@SW_HIDE, $GUI)
		$gui_show = 0
	Else
		_GraphGDIPlus_SaveImage(@ScriptDir & "\" & @MDAY & "_" & @MON & "_" & @YEAR  &".jpg" ,$GUI)
	EndIf
	;
	_GraphGDIPlus_Clear($Graph)
	_GraphGDIPlus_Set_GridX($Graph,1,0xFF6993BE)
	_GraphGDIPlus_Set_GridY($Graph,2,0xFF6993BE)

EndFunc
 
Верх