Что нового

Помогите правильно сохранить изменения в изображении.

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Помогите правильно сохранить изменения в изображении. Вот я импортирую в программу map.jpg, далее если я повожу по нему курсором мыши зажав лкм, на нем останутся следы. Как мне далее сохранить изменения в этом изображении? Чтобы при нажатии на $Button1 у меня в папку со скриптом сохранялся измененный вариант картинки?
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Math.au3>
#include <GDIP.au3>
;~ #Include <GDIPlus.au3>

#include <Misc.au3>
Opt("MustDeclareVars",1)
OnAutoItExitRegister("_Exit")
Global $DLL = DllOpen("user32.dll")
Global $GuiName = "Path Finder v0.6 by Belfigor"
Global $hGUI = GUICreate($GuiName, 612, 537)
GUISetState(@SW_SHOW)
_GDIPlus_Startup ()
Global $hBitmap = _GDIPlus_BitmapCreateFromFile (@ScriptDir & "\map.jpg")
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPLus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 512, 512)
Global $xMax = _GDIPlus_ImageGetWidth ($hBitmap)
Global $yMax = _GDIPlus_ImageGetHeight ($hBitmap)
Global $Radio1 = GUICtrlCreateRadio("Непроходимый", 0, 512, 101, 17)
Global $Radio2 = GUICtrlCreateRadio("Проходимый", 105, 512, 89, 17)
Global $Radio3 = GUICtrlCreateRadio("Старт", 195, 512, 53, 17)
Global $Radio4 = GUICtrlCreateRadio("Финиш", 252, 512, 55, 17)
Global $Radio5 = GUICtrlCreateRadio("Непроходимый+", 310, 512, 101, 17)
Global $Radio6 = GUICtrlCreateRadio("Проходимый+", 415, 512, 170, 17)
Global $Button1 = GUICtrlCreateButton("Start", 512, 0, 100, 25)
Global $Button2 = GUICtrlCreateButton("Restart", 512, 25, 100, 25)
Global $Checkbox1 = GUICtrlCreateCheckbox("Проходимый+", 512, 50, 97, 17)
Global $hPen, $hBrush
While 1
	Local $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
;~ 		Case $nMsg = 3	 To 6
;~ 			;
		Case $Button1
			_GDIPlus_ImageSaveToFile ($hBitmap, @ScriptDir&"\!GDIPlus_Image.jpg")

;~ 			Local $var = GetGeoData()
;~ 			GoHome($var[0], $var[1])
		Case $Button2
			Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
			_GDIPLus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 512, 512)
	EndSwitch
	If _IsPressed("01") And WinActive($GuiName) Then
		If BitAND(GUICtrlRead($radio1), $GUI_CHECKED) = $GUI_CHECKED  Then ;Непроходимый		4278190080
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFF000000)
		ElseIf BitAND(GUICtrlRead($radio2), $GUI_CHECKED) = $GUI_CHECKED  Then ;Проходимый		4294967295
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
		ElseIf BitAND(GUICtrlRead($radio3), $GUI_CHECKED) = $GUI_CHECKED  Then ;Старт			4294901760
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFFFF0000)
		ElseIf BitAND(GUICtrlRead($radio4), $GUI_CHECKED) = $GUI_CHECKED  Then ;Финиш			4278255360
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFF00FF00)
		ElseIf BitAND(GUICtrlRead($radio5), $GUI_CHECKED) = $GUI_CHECKED  Then ;Непроходимый+	4278222976
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFF008080)
		ElseIf BitAND(GUICtrlRead($radio6), $GUI_CHECKED) = $GUI_CHECKED  Then ;Проходимый+		4290822336
			$hBrush =  _GDIPlus_BrushCreateSolid(0xFFC0C0C0)
		EndIf
		Local $pos = GUIGetCursorInfo()
		_GDIPlus_GraphicsFillRect($hGraphics, $pos[0], $pos[1], 10, 10, $hBrush)
	EndIf
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Там, где я что-то поменял, стоит "Yashied".

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Math.au3>
#include <GDIP.au3>
;~ #Include <GDIPlus.au3>

#include <Misc.au3>
Opt("MustDeclareVars", 1)
OnAutoItExitRegister("_Exit")
Global $DLL = DllOpen("user32.dll")
Global $GuiName = "Path Finder v0.6 by Belfigor"
Global $hGUI = GUICreate($GuiName, 612, 537)
GUISetState(@SW_SHOW)
_GDIPlus_Startup()
Global $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\map.jpg")
Global $hBackup = _GDIPlus_ImageClone($hBitmap) ; <=== Yashied
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
Global $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; <=== Yashied
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, 512, 512)
Global $xMax = _GDIPlus_ImageGetWidth($hBitmap)
Global $yMax = _GDIPlus_ImageGetHeight($hBitmap)
Global $Radio1 = GUICtrlCreateRadio("Непроходимый", 0, 512, 101, 17)
Global $Radio2 = GUICtrlCreateRadio("Проходимый", 105, 512, 89, 17)
Global $Radio3 = GUICtrlCreateRadio("Старт", 195, 512, 53, 17)
Global $Radio4 = GUICtrlCreateRadio("Финиш", 252, 512, 55, 17)
Global $Radio5 = GUICtrlCreateRadio("Непроходимый+", 310, 512, 101, 17)
Global $Radio6 = GUICtrlCreateRadio("Проходимый+", 415, 512, 170, 17)
Global $Button1 = GUICtrlCreateButton("Start", 512, 0, 100, 25)
Global $Button2 = GUICtrlCreateButton("Restart", 512, 25, 100, 25)
Global $Checkbox1 = GUICtrlCreateCheckbox("Проходимый+", 512, 50, 97, 17)
Global $hPen, $hBrush
While 1
	Local $nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
;~      Case $nMsg = 3   To 6
;~          ;
		Case $Button1
			_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\!GDIPlus_Image.jpg")

;~          Local $var = GetGeoData()
;~          GoHome($var[0], $var[1])
		Case $Button2
;~			Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) ; <=== Yashied
			_GDIPlus_GraphicsDispose($hContext) ; <=== Yashied
			_GDIPlus_BitmapDispose($hBitmap) ; <=== Yashied
			$hBitmap = _GDIPlus_ImageClone($hBackup) ; <=== Yashied
			$hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; <=== Yashied
			_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBackup, 0, 0, 512, 512) ; <=== Yashied
	EndSwitch
	If _IsPressed("01") And WinActive($GuiName) Then
		If BitAND(GUICtrlRead($Radio1), $GUI_CHECKED) = $GUI_CHECKED Then ;Непроходимый        4278190080
			$hBrush = _GDIPlus_BrushCreateSolid(0xFF000000)
		ElseIf BitAND(GUICtrlRead($Radio2), $GUI_CHECKED) = $GUI_CHECKED Then ;Проходимый        4294967295
			$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
		ElseIf BitAND(GUICtrlRead($Radio3), $GUI_CHECKED) = $GUI_CHECKED Then ;Старт          4294901760
			$hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000)
		ElseIf BitAND(GUICtrlRead($Radio4), $GUI_CHECKED) = $GUI_CHECKED Then ;Финиш          4278255360
			$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)
		ElseIf BitAND(GUICtrlRead($Radio5), $GUI_CHECKED) = $GUI_CHECKED Then ;Непроходимый+   4278222976
			$hBrush = _GDIPlus_BrushCreateSolid(0xFF008080)
		ElseIf BitAND(GUICtrlRead($Radio6), $GUI_CHECKED) = $GUI_CHECKED Then ;Проходимый+       4290822336
			$hBrush = _GDIPlus_BrushCreateSolid(0xFFC0C0C0)
		EndIf
		Local $pos = GUIGetCursorInfo()
		_GDIPlus_GraphicsFillRect($hGraphics, $pos[0], $pos[1], 10, 10, $hBrush)
		_GDIPlus_GraphicsFillRect($hContext, $pos[0], $pos[1], 10, 10, $hBrush) ; <=== Yashied
	EndIf
WEnd
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938

Других слов подобрать не смог :smile:
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
А как сохранить картинку без потери качества? То есть я порисовал на изображении, например белым цветом 0xFFFFFFFF, сохранил, смотрю цвета а там ни фига не чисто белый :(
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
в место .jpg использовать .bmp формат
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Это не совсем то решение которое мне нужно :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Belfigor
rusreg79 правильно говорит. тебе нужно использовать любой формат без потери качества - bmp, png и т.д. полный список можешь глянуть тут Сжатие без потерь
jpg тоже можно организовать без потерь, но я не знаю как, да и не стоит оно того. png - самое то
 
Автор
B

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Ладно, прибегну к PNG. Спасибо :smile:
 
Верх