• Offizieller Beitrag

    Mit diesem Programm kann man seine Bildersammlung sichten und nach Wunsch in bis zu fünf Zielverzeichnisse kopieren.
    Ablauf ist dabei folgender: Quellverzeichnis auswählen. Dieses wird dann eingelesen und Bild für Bild angezeigt. Man kann dann mit den Sprungbuttons (+- 1/10/100) weiter-/zurückspringen oder durch Eingabe einer Nummer das jeweilige Bild direkt aufrufen. Das angezeigte Bild läßt sich in ein Zielverzeichnis kopieren. Fünf dieser Zielverzeichnisse kann man vorwählen. Für die Anzeige gibt es noch einen Button zum drehen des Bildes in 90 Grad Schritten. Bildname, -nummer und -format werden in der Statusleiste angezeigt. Die skalierte Größe steht in der Titelleiste.
    Man kann außerdem mehrere Einstellungen vornehmen:
    - Quellverzeichnis rekursiv (inkl. Unterverzeichnisse) einlesen.
    - Alle von GDI+ unterstützten Dateiformate stehen zur Auswahl (Checkboxen).
    - Beim kopieren hat man die Auswahl zwischen vorhandene Datei überschreiben oder umbenennen (Zähler anhängen).

    Update v1.1 16.04.13:
    - Man kann jetzt die Hintergrundfarbe verändern. Zur Auswahl stehen: Schachbrettmuster, Weiß und Schwarz.

    Update v1.2 16.04.13:
    - Schachbrettmuster wird jetzt schneller erstellt (bzw. nur einmal und dann nur noch kopiert). Danke UEZ!
    - Es gibt noch mehr Tastenbelegungen. Hier mal komplett:

    Code
    [ALT] + [1] ... [5] kopieren des angezeigten Bildes in das entsprechende Zielverzeichnis.
       [ALT] + [r] drehen des Bildes in 90-Grad-Schritten.
       [ALT] + [b] ändern der Hintergrundfarbe.
       [ALT] + [->] zum nächsten Bild springen.
       [ALT] + [<-] zum vorherigen Bild springen.

    Update v1.3 18.04.13:
    - Einige Funktionen optimiert.
    - Löschbutton hinzugefügt. Die Sicherheitsabfrage beim Löschen kann man durch gedrückthalten der [SHIFT]-Taste umgehen. Es wird dann das Bild sofort gelöscht.

    Update v1.4 20.04.13:
    - Es gibt jetzt einen Vollbildmodus. Ein Doppelklick auf das angezeigte Bild und das Bild wird im Vollbildmodus angezeigt. Die [ESC]-Taste beendet den Vollbildmodus wieder.

    Update v1.5 02.07.17:
    - "Fehler" im Script beseitigt, damit es auch mit der aktuellen Version von AutoIt funktioniert.


    Screenshot:
    autoit.de/wcf/attachment/20772/

  • Ganz nettes Tools :thumbup:

    Vielleicht könnte man den Hintergrund für transparente Bilder anders Darstellen als das schlichte schwarz, wie z.B. das klassische Schachbrettmuster.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Nice tool, :thumbup:

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Du könntest folgende Funktion nehmen, um das Pattern schneller zu erzeugen:

    [autoit]


    Func _DrawPattern($iLeft, $iTop, $iWidth, $iHeight)
    Local $iBrush = True, $iStep = 8
    _GDIPlus_GraphicsFillRect($hGraphicBuff, $iPreviewLeft, $iPreviewTop, $iPreviewWidth, $iPreviewHeight, $ahBrush[2])
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", 2 * $iStep, "int", 2 * $iStep, "int", 0, "int", $GDIP_PXF32ARGB, "ptr", 0, "int*", 0)
    Local $hBitmap = $aResult[6]
    Local $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsFillRect($hCtxt, 0, 0, $iStep, $iStep, $ahBrush[0])
    _GDIPlus_GraphicsFillRect($hCtxt, $iStep, 0, $iStep, $iStep, $ahBrush[1])
    _GDIPlus_GraphicsFillRect($hCtxt, 0, $iStep, $iStep, $iStep, $ahBrush[1])
    _GDIPlus_GraphicsFillRect($hCtxt, $iStep, $iStep, $iStep, $iStep, $ahBrush[0])
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateTexture", "handle", $hBitmap, "int", 0, "int*", 0)
    Local $hTexture = $aResult[3]
    _GDIPlus_GraphicsFillRect($hGraphicBuff, $iPreviewLeft, $iPreviewTop, $iPreviewWidth, $iPreviewHeight, $hTexture)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BrushDispose($hTexture)
    _GDIPlus_BitmapDispose($hBitmap)
    EndFunc

    [/autoit]

    Ferner könntest du das Pattern einmal erstellen und nur die Bitmap kopieren, als immer das Pattern neu zu erstellen, denn es ändert sich nichts daran.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • 2 Dinge sind mir noch aufgefallen:

    1) die Funktion _DrawBgColor() ist so performanter

    [autoit]


    Func _DrawBgColor($iLeft, $iTop, $iWidth, $iHeight)
    Switch $iBgColor
    Case 0
    _GDIPlus_GraphicsFillRect($hGraphicBuff, $iPreviewLeft, $iPreviewTop, $iPreviewWidth, $iPreviewHeight, $hTexture)
    Case 1
    _GDIPlus_GraphicsFillRect($hGraphicBuff, $iPreviewLeft, $iPreviewTop, $iPreviewWidth, $iPreviewHeight, $ahBrush[3])
    Case 2
    _GDIPlus_GraphicsFillRect($hGraphicBuff, $iPreviewLeft, $iPreviewTop, $iPreviewWidth, $iPreviewHeight, $ahBrush[2])
    EndSwitch
    EndFunc

    [/autoit]

    2) Apropos Performance _ShowStatus() ist ziemlich langsam. Beim Blättern benötige die Funktion um die 400 ms. Da ist bestimmt noch Raum für Optimierungen. ;)

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    • Offizieller Beitrag

    UEZ: Ja, das mit dem Switch hatte ich auch schon bemerkt. Ist auch schon geändert. _ShowStatus() selbst ist gar nicht so das Problem. _CheckButtons() hatte so lange gedauert. Dafür habe ich jetzt aber schon eine Lösung:

    [autoit]

    GUISetState(@SW_LOCK, $hGui)

    [/autoit]


    an den Anfang und

    [autoit]

    GUISetState(@SW_UNLOCK, $hGui)

    [/autoit]


    ans Ende der Funktion und schon ist die Funktion gut 7mal so schnell. :) Danke, für den Hinweis!

    HassanMullah: Stimmt, ein Löschen-Button wäre ganz brauchbar. Es ist ja noch Platz! Das ist schnell gemacht. :)

  • Liegt daran daß das Skript entwickelt wurde als es 3.3.14.2 noch gar nicht gab. Mein Versuch:

    läßt sich zwar kompilieren aber das Programm wird kurz nach Start geschlossen. @Oscar bzw. @UEZ die Func _CreatePatternTexture() verursacht imho dieses Problem.

  • Öhm, wenn du noch Langeweile hast: Wenn Gifs angezeigt werden könnten bei diesen auch die Animationen angezeigt werden (ja, es soll auch Gifs ohne Animationen geben - habe ich aber nicht)

    Und zum "Überschreiben oder Namen ändern": Vielleicht eine Option wie "Wenn Ziel und Quelle gleich sind, überspringen". Gleich im Sinne von beide Dateien gleicher Inhalt.

    Ein "Fehler" wäre da noch beim Zähler (1) anhängen:
    [Blockierte Grafik: https://znil.net/images/e/e8/ClipCapIt-170703-123232.PNG]
    War zufällig meine Testdatei ... die Klammern sollen ja bestimmt an das Ende.

    Das Tool hat seit eben (als ich es gesehen hatte) gleich einen festen Platz bei mir bekommen ... Ich habe das sonst immer mit dem Bildbetrachter und 6 offenen Datei-Explorer-Fenstern gemacht,
    deine Idee gefällt mir besser und ist schneller.

    • Offizieller Beitrag

    Vielleicht eine Option wie "Wenn Ziel und Quelle gleich sind, überspringen". Gleich im Sinne von beide Dateien gleicher Inhalt.

    Das ist bei Bildern nicht ganz so einfach. Kleine Änderungen führen nicht zwangsläufig zu einer geänderten Dateigröße.
    Und wenn man den Vergleich über die Checksumme macht, dann dauert das recht lange.

    Ein "Fehler" wäre da noch beim Zähler (1) anhängen:

    Stimmt! Mehrere Punkte innerhalb des Dateinamens habe ich nicht berücksichtigt. Das werde ich ändern!

    Wenn Gifs angezeigt werden könnten bei diesen auch die Animationen angezeigt werden

    Dafür hatte ich mal einiges aus dem Netz zusammengesucht und ein Script erstellt.
    Mal schauen, ob ich das da einbauen kann.

  • Ich war gestern Abend hin und her gerissen ob ich mich selbst daran mache ... aber so ein wenig wiederstrebt es mir wenn dann 90% von einem anderen ist.
    Und sich zu trauen das Skript eines Author zu verbessern, von dem in jedem 2. eigenen Skript mindestens eine Funktion oder mehr steckt :/

  • Ich zerlege gerade das Skript - und lerne fleißig.
    Ich weis was die folgende Zeile macht - die Checkboxen setzen, aber ich habe nicht ganz das "Wie" verstanden:


    AutoIt
    For $i = 1 To $aDecoders[0][0]
        $aIDPicFormat[$i - 1] = GUICtrlCreateCheckbox($aDecoders[$i][5], 600 + Mod($i - 1, 5) * 70, 173 + Int(($i - 1) / 5) * 25, 55, 20)

    Mir geht es nur um die X und Y Koordinaten des GUICtrlCreateCheckbox() Befehls.
    Das Ergebnis ist, das alle Werte aus dem Array in 2 Reihen hintereinander eine Checkbox erhalten

    Fangen wir mit X an:
    600 + Mod($i - 1, 5) * 70

    • Bei 600 Pixeln von links fangen wir an
    • ist die erste Reihe "voll" soll die nächste Reihe 70 Pixel weiter kommen
    • Mod kannte ich bisher nur zur "Gerade/Ungrade" Ermittlung ... naja, es sind ja nur 2 zeilen, also Gerade Zeile 1, Ungerade Zeile 2 nehme ich an (Falsch!)

      • Mod($i - 1, 5) ... Ich weis da kommt bei $i = 1 To 10 die Zahlenfolge 0 1 2 3 4 0 1 2 3 4 raus ... genutzt werden dazu $i = 0 1 2 3 4 5 6 7 8 9 ...
      • Also wird wohl eher erst Zeile 1 und dann Zeile 2 befüllt ... ok
      • und die 5 als 2. Parameter sorgt bestimmt dafür das es alle 5 Werte wieder von vorne losgeht, also werden es 5 Spalten
      • So, auch nach dem 10 Lesen des Eintrages in der Hilfe habe ich den Befehl Mod() nicht verstanden ... auch wenn ich sehe was er macht.
      • Etwas gegoogelt ... immer noch nicht schlauer. Dreisatz kann ich noch, der Rest ist so 25 Jahre her.
    • Was danach passiert ist klar: Das Ergebnis von Mod wird mal dem gewünschten Abstand der Spalten = 70 genommen. Also ergibt sich +0, +70, +140, +210, +280 ... und wieder von vorne

    Nun Y, ist bestimmt einfacher:
    173 + Int(($i - 1) / 5) * 25

    • Bei 173 Pixeln von oben ist die erste Zeile ... * 25 ... und bei 198 Pixel die 2. Zeile
    • ($i - 1) ... ok, wieder die Zahlenfolge 0 1 2 3 4 5 6 7 8 9
    • ($i - 1) / 5) ... und die Zahlenfolge teilen wir immer durch 5 ... also ist die Zahlenfolge nun 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8
    • Int() gibt uns davon nur die ganze Zahl, also den Teil vor dem Komma/Punkt wieder. Zahlenfolge ist also 0 0 0 0 0 1 1 1 1 1
    • Und das dann mal 25. Wir addieren also zum Startwert 4 x 0 (=Nichts) und 4 x 25
    • Ok, Y habe ich verstanden. So ganz und im allen

    Dann bleibt ja nur noch eines übrig:
    Jemand müsste mir mal bitte den Befehl Mod() erklären.
    Aber bitte so wie man es einem 6-Jährigen erklären würde - Danke!


    Schöne Grüße,
    BLinz