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
Aufziehen von Bereichen Topic is solved
Moderator: jNizM
Aufziehen von Bereichen
- Attachments
-
- Bereich_markieren.png (56.28 KiB) Viewed 3016 times
Re: Aufziehen von Bereichen
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.
Re: Aufziehen von Bereichen
Vielen Dank, aber so richtig hilft das nicht weiter. Es ist ja nicht so, dass ich nicht schon gesucht hätte ...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.
Aber vielleicht kannst Du mir von den "vielen Screenshot-Funktionen" wenigstens mal eine nennen (Link wäre nett), damit ich einen Anhaltspunkt habe
Re: Aufziehen von Bereichen
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.
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
}
}
Re: Aufziehen von Bereichen
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.
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.
Re: Aufziehen von Bereichen
OK, Danke. Ich probier mich mal am Wochenende durch. Und melde mich dann wieder. Erst mal schöner WE.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.
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.
Re: Aufziehen von Bereichen
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 ). Manches krieg ich irgendwie hin (das mit dem Bilder markieren ist ein typisches Beispiel), aber wahrscheinlich geht etliches davon doch noch wesentlich eleganter.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.
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
Re: Aufziehen von Bereichen
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
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
Re: Aufziehen von Bereichen Topic is solved
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?
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%
}
Re: Aufziehen von Bereichen
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]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.
Also, vielen Dank nochmals
Julius
Who is online
Users browsing this forum: WPLPHSS and 17 guests