Aufziehen von Bereichen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Julius
Posts: 67
Joined: 15 Sep 2015, 07:41
Contact:

Aufziehen von Bereichen

29 May 2018, 13:20

Hallo, für ein kleines Projekt im Bereich Sprachtherapie / Logopädie möchte ich auif einem Bild (jpg, png) durch Ziehen mit gedrückter linker Maustaste verschiedene rechteckige Bereiche markieren und dann mit Begriffen hinterlegen, die dann beim Anklicken des Bereichs angezeigt und von der Systemstimme vorgelesen werden. Also etwa auf dem Bild eines Marktstands verschiedene Gemüse oder Blumen markieren. Der Patient denkt das Wort beim Sehen, sieht es beim Anklicken auch geschrieben und hört es dann noch ausgesprochen; so lernt man langsam wieder sprechen (z. B. nach einem Schlaganfall).
Bloß: wie zieht man so einen rechteckigen Bereich auf und notiert dann die Ecken? Bisher behelfe ich mir mit einem etwas umständlichen Prozedere (siehe Anhang). Ich möchte das Programm aber einem Logopäden an die Hand geben, und da solllte das Vorgehen einfacher werden.
Vielen Dank schon mal ...
Julius
Attachments
Bereich_markieren.png
Bereich_markieren.png (56.28 KiB) Viewed 2992 times
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Aufziehen von Bereichen

29 May 2018, 16:20

Such mal unter den vielen Screenshot Funktionen. Da wirst Du locker fündig. Viele haben eine Funktion zum auswählen eines Teilbereiches mit der Maus.
Julius
Posts: 67
Joined: 15 Sep 2015, 07:41
Contact:

Re: Aufziehen von Bereichen

30 May 2018, 09:24

Frosti wrote:Such mal unter den vielen Screenshot Funktionen. Da wirst Du locker fündig. Viele haben eine Funktion zum auswählen eines Teilbereiches mit der Maus.
Vielen Dank, aber so richtig hilft das nicht weiter. Es ist ja nicht so, dass ich nicht schon gesucht hätte ...
Aber vielleicht kannst Du mir von den "vielen Screenshot-Funktionen" wenigstens mal eine nennen (Link wäre nett), damit ich einen Anhaltspunkt habe ;)
User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Aufziehen von Bereichen

30 May 2018, 14:55

War gestern nur am IPad. Da macht sich das nicht so leicht mit Code suchen und kopieren. Heute am Rechner kopiere ich Dir eine Funktion aus meiner Sammlung.

Code: Select all

getSelectionCoords(ByRef x_start, ByRef x_end, ByRef y_start, ByRef y_end) {			;-- creates a click-and-drag selection box to specify an area

	/*			EXAMPLE

				;hotkey to activate OCR
				!q:: ;press ALT Q
				getSelectionCoords(x_start, x_end, y_start, y_end)
				MsgBox, In area :: x_start: %x_start%, y_start: %y_start% --> x_end: %x_end%, y_end: %y_end%
				return

			Esc:: ExitApp

	*/

	;Mask Screen
	Gui, Color, FFFFFF
	Gui +LastFound
	WinSet, Transparent, 50
	Gui, -Caption
	Gui, +AlwaysOnTop
	Gui, Show, x0 y0 h%A_ScreenHeight% w%A_ScreenWidth%,"AutoHotkeySnapshotApp"

	;Drag Mouse
	CoordMode, Mouse, Screen
	CoordMode, Tooltip, Screen
	WinGet, hw_frame_m,ID,"AutoHotkeySnapshotApp"
	hdc_frame_m := DllCall( "GetDC", "uint", hw_frame_m)
	KeyWait, LButton, D
	MouseGetPos, scan_x_start, scan_y_start
	Loop
	{
		Sleep, 10
		KeyIsDown := GetKeyState("LButton")
		if (KeyIsDown = 1)
		{
			MouseGetPos, scan_x, scan_y
			DllCall( "gdi32.dll\Rectangle", "uint", hdc_frame_m, "int", 0,"int",0,"int", A_ScreenWidth,"int",A_ScreenWidth)
			DllCall( "gdi32.dll\Rectangle", "uint", hdc_frame_m, "int", scan_x_start,"int",scan_y_start,"int", scan_x,"int",scan_y)
		} else {
			break
		}
	}

	;KeyWait, LButton, U
	MouseGetPos, scan_x_end, scan_y_end
	Gui Destroy

	if (scan_x_start < scan_x_end)
	{
		x_start := scan_x_start
		x_end := scan_x_end
	} else {
		x_start := scan_x_end
		x_end := scan_x_start
	}

	if (scan_y_start < scan_y_end)
	{
		y_start := scan_y_start
		y_end := scan_y_end
	} else {
		y_start := scan_y_end
		y_end := scan_y_start
	}

}
Ich habe die Funktion nicht ausprobiert. Ich hoffe Sie funktioniert wie Du sie brauchst.
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Aufziehen von Bereichen

31 May 2018, 03:42

Moin Julius,

die meisten Screenshot-Skripte arbeiten mit Bildschirmkoordinaten. Deshalb zunächst noch zwei Fragen:

1. Wie kommt das Bild auf den Schirm?
2. Sind Position und Größe des Bildes immer gleich, d.h. kann man mit Bildschirmkoordinaten arbeiten?

Grüße,
just me

Übrigens: Ich wohne immer noch in Berlin, habe relativ viel Zeit und auch noch etwas Motivation. Ich bin nach wie vor bereit, kommhelp Projekte im Rahmen meiner Möglichkeiten unentgeltlich zu unterstützen. Wenn Du Interesse hast, können wir gern persönlich in Kontakt treten.
Julius
Posts: 67
Joined: 15 Sep 2015, 07:41
Contact:

Re: Aufziehen von Bereichen

01 Jun 2018, 14:27

Frosti wrote:War gestern nur am IPad. Da macht sich das nicht so leicht mit Code suchen und kopieren. Heute am Rechner kopiere ich Dir eine Funktion aus meiner Sammlung.
Ich habe die Funktion nicht ausprobiert. Ich hoffe Sie funktioniert wie Du sie brauchst.
OK, Danke. Ich probier mich mal am Wochenende durch. Und melde mich dann wieder. Erst mal schöner WE.

Edit: Funktioniert super. Danke!!

4.6.18
Jetzt habe ich von just me ein fertiges Script frei Haus bekommen, das ich verwenden werde. Trotzdem Danke für Deine Hilfe, das landet jetzt nicht gleich im Trash.
Last edited by Julius on 04 Jun 2018, 12:07, edited 3 times in total.
Julius
Posts: 67
Joined: 15 Sep 2015, 07:41
Contact:

Re: Aufziehen von Bereichen

01 Jun 2018, 14:42

just me wrote:Moin Julius,

die meisten Screenshot-Skripte arbeiten mit Bildschirmkoordinaten. Deshalb zunächst noch zwei Fragen:

1. Wie kommt das Bild auf den Schirm?
2. Sind Position und Größe des Bildes immer gleich, d.h. kann man mit Bildschirmkoordinaten arbeiten?

Grüße,
just me

Übrigens: Ich wohne immer noch in Berlin, habe relativ viel Zeit und auch noch etwas Motivation. Ich bin nach wie vor bereit, kommhelp Projekte im Rahmen meiner Möglichkeiten unentgeltlich zu unterstützen. Wenn Du Interesse hast, können wir gern persönlich in Kontakt treten.
Moin auch, Dein Angebot ist super; ich habe einige offene Baustellen - sprich: Sachen, die ich gerne mal ausprobieren bzw. realisieren möchte, und bei vielen Fragestellungen fehlt mir einfach das know-how (siehe einige meiner postings :roll: ). Manches krieg ich irgendwie hin (das mit dem Bilder markieren ist ein typisches Beispiel), aber wahrscheinlich geht etliches davon doch noch wesentlich eleganter.
Direkter Kontakt wäre da ganz toll, dann lässt sich manches wesentlich leichter angehen. Ich schick Dir eine pm.

Position und Größe der Bilder variieren, ebenso die Anzahl und Position der zu markierenden Bereiche. Das Bild kommt mit FileSelectFile auf den Schirm:

Code: Select all

------- ? ? ?  Beschreibung/Description  ? ? ? ------------------------------------------
Auf JPG-Bildern können rechteckige Bereiche markiert und jedem bereich ein Text (Beschreibung) zugeordnet werden.
Mit "Sprechende Bilder" wird der Text eines Bereichs angezeigt bzw. gesprochen, wenn der Bereich angeklickt wird.
Entwickelt für logopädische Therapie.
-------------------------------------------------------------------------------------------------------
Dieses Programm ist kostenlos und darf auch kostenlos weitergegeben werden.
Es darf auch jederzeit verbessert werden ;). Dann bitte Nachricht an [email protected].
 ~    ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~ 
 */

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

; - - Abbildungsparameter  - -
GUIHoch := A_ScreenHeight*0.95 ; Höhe der Gui
BildHoch := GUIHoch*0.95  ; Höhe des Bilds
; - - - - - - - - - - - - - - - - - - - - - -

FileSelectFile, Bild, , Bilder, , *.jpg
SplitPath, Bild, Bild
StringTrimRight, Titel, Bild, 4
if (Titel = "")
	goto GuiClose
else
	MsgBox, 65, kommhel soft ,Bereits vorhandene Markierungen in  <%Titel%.txt> werden überschrieben! `n`n Eine Kopie mit dem Zusatz _"Sicherung" wird erstellt. `n`nZum Markieren der Eckne:  RECHTE Maustaste drücken! `n`nNach der zweiten Ecke geben Sie den Namen des Rahmens ein! `n`nTIP:  Rahmen eher größer als zu klein festlegen!
IfMsgBox Cancel
	goto GuiClose
Datei = Bilder/%Titel%.txt
FileCopy, %Datei%, Bilder\%Titel%_Sicherheitskopie.txt, 1

StartZeile := BildHoch . " Referenzhöhe" ; Übergabe der Bildhöhe bei der Festlegung der Rahmen
IfExist, %Datei%
	FileDelete,  %Datei%
FileAppend, %StartZeile%, %Datei%, ; schreibt aktuelle Bildhöhe in die erste zeile der Datei

Anzeige = Bilder/%Bild%
Gui, add, Pic,  x0 y0 w-1 h%BildHoch%,  %Anzeige%
Gui, show, Autosize xCenter , kommhelp soft  Bild markieren:  %Titel%

Ecke := 0 ; Flag: es wurde noch keine Ecke des aktuellen Rahmens markiert
Loop
{
	MouseGetPos, X, Y
	;~ ToolTip, % "X:.  " X "  Y :  " Y "`nRECHTE Maustaste!!"
}
return

~RButton::
if (Ecke = 0)
{
	XPos1 := X
	YPos1 := Y
	Ecke := 1
}
else if (Ecke = 1)
{
	Ecke = 0
	XPos2 := X
	YPos2 := Y
	gosub EckenSortieren
	Weit := Abs(XPos2 - XPos1)
	Hoch := Abs(YPos2 - YPos1)
	XGb := XPos1 
	YGb := YPos1 -25
	Gui, add, GroupBox, x%XGb% y%YGb% w%Weit% h%Hoch% HwndRahmen
	gosub FensterPlatzieren
	InputBox, Name, Bezeichnung des Rahmens, Geben Sie einen Namen für diese Aktivfläche ein `nSpeichern mit OK oder Rahmen verwerfen mit CANCEL, , 280, , XBox, YBox
	if (errorlevel = 0)
	{
		XPos1 = %Xpos1%#
		XPos2 = %Xpos2%#
		YPos1 = %Ypos1%#
		YPos2 = %Ypos2%
		Name = `n%Name%#
		Zeile := Name . XPos1 . XPos2 . YPos1 . YPos2
		FileAppend, %Zeile%, %Datei%
		Gui, add, GroupBox, x%XGb% y%YGb% w%Weit% h%Hoch% HwndRahmen, %Name%
	}
	else
		GuiControl, Hide, %Rahmen%
}
return

FensterPlatzieren:
XBox := XGb * 0.8
if (YPos2 + Hoch +190  > BildHoch)
	YBox := YPos2 - BildHoch / 2
else
	YBox := YPos2 + 20
return

EckenSortieren:
if (XPos2 < XPos1)
{
	XPos0 := XPos1
	XPos1 := XPos2
	XPos2 := XPos0
	if (YPos2 < YPos1)
	{
		YPos0 := YPos1
		YPos1 := YPos2
		YPos2 := YPos0
	}
}
if (YPos2 < YPos1)
{
	YPos0 := YPos1
	YPos1 := YPos2
	YPos2 := YPos0
	if (XPos2 < YPos1)
	{
		XPos0 := XPos1
		XPos1 := XPos2
		XPos2 := XPos0
	}
}
return


GuiClose:
ExitApp
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Aufziehen von Bereichen

02 Jun 2018, 03:12

Moin Julius,

dann hat ja AHK alles unter Kontrolle, und das 'vereinfacht' die Sache, wenn die Anzeige bei der späteren Anwendung ebenfalls von AHK gesteuert wird.

Ich denke, man kann das ohne allzu großen Aufwand 'aufhübchen'.

Bis bald,
just me
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Aufziehen von Bereichen  Topic is solved

03 Jun 2018, 03:21

Moin Julius,

hier ist ein Entwurf für die Markierung mit der linken Maustaste. Das Skript verwendet als 'einfache Lösung' durchscheinende GUIs für die Anzeige der markierten Bereiche. In den Global Variablen kann man einige Voreinstellungen setzen.

Ich weiß nicht, wie die 'Bereichssdatei' weiter verarbeitet wird ("Sprechende Bilder") . Deshalb mag noch etwas zusätzliche Arbeit nötig sein. Mit der Anzeige der Bereichsnamen bin ich auch noch nicht zufrieden. Geht das trotzdem in die richtige Richtung?

Code: Select all

/*
------- ? ? ?  Beschreibung/Description  ? ? ? -----------------------------------------------------------------------------------
Auf JPG-Bildern können rechteckige Bereiche markiert und jedem bereich ein Text (Beschreibung) zugeordnet werden.
Mit "Sprechende Bilder" wird der Text eines Bereichs angezeigt bzw. gesprochen, wenn der Bereich angeklickt wird.
Entwickelt für logopädische Therapie.
----------------------------------------------------------------------------------------------------------------------------------
Dieses Programm ist kostenlos und darf auch kostenlos weitergegeben werden.
Es darf auch jederzeit verbessert werden ;). Dann bitte Nachricht an [email protected].
 ~    ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~   ~
*/

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode, Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir, %A_ScriptDir%  ; Ensures a consistent starting directory.
SetBatchLines, -1  ; Have the script run at maximum speed.
; ================================================================================================================================
; - - Globale Variablen und Einstelungen  - -
Global HPIC                      ; Handle des Bild-Controls
Global Datei                     ; Name der Markierungsdatei
Global Verzeichnis := "Bilder"   ; Verzeichnis der Bider
Global HM := 0                   ; Handle des aktuellen Markierungsfenster
Global MX, MY, MW, MH            ; aktuelle Position und Größe des Markierungsfensters
Global MinH := 20                ; minimale Höhe einer Markierung
Global MinW := 20                ; minimale Breite einer Markierung
Global Trans := 100              ; Transparenz des Markierungsfensters
Global Bereiche := []            ; Objekt für bereits markierte Bereiche
; ================================================================================================================================
; - - Abbildungsparameter  - -
GUIHoch := Round(A_ScreenHeight * 0.95)   ; Höhe der Gui (gerundet)
BildHoch := Round(GUIHoch * 0.95)         ; Höhe des Bilds (gerundet)
; ================================================================================================================================
; - - Bilderverzeichnis  - -
If !InStr(FileExist(Verzeichnis), "D") ; wenn das Unterverzeichnis Bilder noch nicht existiert
   FileCreateDir, %Verzeichnis%
; ================================================================================================================================
; - - Auswahl der Bilddatei  - -
FileSelectFile, Bild, 3, %Verzeichnis%, kommhelp soft - Bitte ein Bild auswählen ..., Bilder (*.jpg)
SplitPath, Bild, , , , Titel
If (Titel = "")
{
   MsgBox, 16, kommhelp soft, Sie haben keine Bilddatei ausgewählt!`n`nDie Anwendung wird beendet!
	ExitApp
}
; ================================================================================================================================
; - - Markierungsdatei  - -
Datei := Verzeichnis . "\" . Titel . ".txt"
If FileExist(Datei)
{
   MsgBox, 36, kommhelp soft,
      (LTrim
         Es gibt bereits eine Markierungsdatei "%Datei%"!

         Soll die Verarbeitung fortgesetzt werden?

         Ggf. wird eine Kopie mit dem Zusatz "_Sicherung" erstellt.
      )
   IfMsgBox, YES
      FileCopy, %Datei%, %Verzeichnis%\%Titel%_Sicherheitskopie.txt, 1
   Else
      ExitApp
   FileDelete, %Datei%
}
; ================================================================================================================================
; - - Abbildungsparameter speichern - -
StartZeile := BildHoch . " Referenzhöhe" ; Übergabe der Bildhöhe bei der Festlegung der Rahmen
FileAppend, %StartZeile%, %Datei%, ; schreibt aktuelle Bildhöhe in die erste zeile der Datei
; ================================================================================================================================
; - - Hauptfenster für das Bild erstellen  - -
Gui, Main:+OwnDialogs
Gui, Main:Margin, 0, 0 ; Abstände auf Null setzen
Gui, Main:Add, Pic, w-1 h%BildHoch% vPic +hwndHPIC +0x0100, %Bild% ; v Option, hwnd Option und SS_NOTIFY (0x0100) style zugefügt
Gui, Main:Show, , kommhelp soft - Bild markieren: %Titel%
OnMessage(0x0201, "WM_LBUTTONDOWN")
MsgBox, 0, kommhelp soft,
   (LTrim
      Zum Markieren von Bildbereichen bitte mit der linken Maustaste
      auf die obere linke Ecke des Bereichs klicken und die Auswahl
      dann mit gedrückter Maustaste nach rechts unten aufziehen.

      Die markierten Bereiche müssen mindesten %MinW% Pixel breit und %MinH%
      Pixel hoch sein.
   )
Return
; ================================================================================================================================
; - - Das Programm wurde beendet - -
MainGuiClose:
ExitApp
; ================================================================================================================================
WM_LBUTTONDOWN(wParam, lParam) {
   ; msdn.microsoft.com/en-us/library/windows/desktop/ms645607(v=vs.85).aspx
   ; Globale Variablen: MX, MY, MW, MH
   If (A_GuiControl = "Pic") {
      MX := lParam & 0xFFFF
      MY := lParam >> 16
      MW := 0
      MH := 0
      ClipCursor(1)
      OnMessage(0x0202, "WM_LBUTTONUP")
      OnMessage(0x0200, "WM_MOUSEMOVE")
      CreateSelectionGui()
   }
}
; ================================================================================================================================
WM_LBUTTONUP(wParam, lParam) {
   ; msdn.microsoft.com/en-us/library/windows/desktop/ms645608(v=vs.85).aspx
   ; Globale Variablen: HM, MX, MY, MW, MH, Datei
   OnMessage(0x0200, "")
   OnMessage(0x0202, "")
   ClipCursor()
   If (MW < MinW) || (MH < MinH)
   {
      Gui, %HM%:Destroy
   }
   Else
   {
      Gui, Main:+OwnDialogs
   	InputBox, Name
              , Bezeichnung des Fläche
              , Geben Sie einen Namen für diese Aktivfläche ein`n`nSpeichern mit OK oder Fläche verwerfen mit CANCEL
              , , 280
   	If (ErrorLevel = 0)
   	{
   		Zeile := Format("`n{:}#{:}#{:}#{:}#{:}", Name, MX, MX + MW, MY, MY + MH)
   		FileAppend, %Zeile%, %Datei%
         Gui, %HM%:Add, Text, w%MW% h%MH% Center +0x0200 +BackgroundTrans, %Name%
         Gui, %HM%:Show
   	}
   	Else
      {
   		Gui, %HM%:Destroy
      }
   }
   HM := MX := MY := MW := MH := 0
}
; ================================================================================================================================
WM_MOUSEMOVE(wParam, lPAram) {
   ; msdn.microsoft.com/en-us/library/windows/desktop/ms645616(v=vs.85).aspx
   ; Globale Variablen: HM, MX, MY, MW, MH
   X := lParam & 0xFFFF
   Y := lParam >> 16
   MW := X - MX
   MH := Y - MY
   Gui, %HM%:Show, x%MX% y%MY% w%MW% h%MH%
}
; ================================================================================================================================
; - - Cursorbewegung begrenzen / Begrenzung aufheben - -
ClipCursor(Clip := False) {
   ; msdn.microsoft.com/en-us/library/windows/desktop/ms648383(v=vs.85).aspx
   ; Globale Variablen: HPIC
   If (Clip) { ; Cursorbewegung begrenzen, anderenfalls Begrenzung aufheben
      VarSetCapacity(RC, 16, 0)
      DllCall("GetWindowRect", "Ptr", HPIC, "Ptr", &RC)
   }
   DllCall("ClipCursor", "Ptr", Clip ? &RC : 0)
}
; ================================================================================================================================
; - - Markierungsfenster erstellen - -
CreateSelectionGui() {
   ; Globale Variablen: HPIC, HM, Trans
   Gui, New, -Caption +LastFound +hwndHM +parent%HPIC%
   Gui, Margin, 0, 0
   Gui, Font, s10 Bold
   Gui, Color, White
   WinSet, Transparent, %Trans%
}
Julius
Posts: 67
Joined: 15 Sep 2015, 07:41
Contact:

Re: Aufziehen von Bereichen

04 Jun 2018, 12:03

just me wrote:
Ich weiß nicht, wie die 'Bereichssdatei' weiter verarbeitet wird ("Sprechende Bilder") . Deshalb mag noch etwas zusätzliche Arbeit nötig sein. Mit der Anzeige der Bereichsnamen bin ich auch noch nicht zufrieden.
Das ist perfekt. Die erzeugten Dateien fuktionieren im Anzeigeprogramm einwandfrei. Genauso habe ich mir das vorgestellt. 1000 Dank! [Jetzt werde ich versuchen, das auch Zeile für Zeile im Detail zu verstehen]

Also, vielen Dank nochmals
Julius

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 22 guests