Pixster - Bildanzeiger

Veröffentliche deine funktionierenden Skripte und Funktionen

Moderator: jNizM

User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Pixster - Bildanzeiger

29 Apr 2020, 10:07

Geschätztes Forum,

aufgrund der momentanen coronalen Einschränkung bleibt jetzt viel Zeit fürs Coden daheim... Daher habe ich mich einmal mit "Liegengebliebenem" befasst und den Bildanzeiger Pixster mit tics genialer Gdip_All.ahk soweit funktional fertiggestellt.
Pixster ist ein Bildanzeiger für die Formate bmp, gif, jpg, png und tiff. Beim Doppelklicken einer Bilddatei wird der Inhalt verpixelt eingeblendet und bei nicht transparenten Formaten mit einem abgerundeten Hintergrund angezeigt. Transparente Formate wie gif, png und tiff werden ohne Hintergrund angezeigt. Ein Rechtsklick verpixelt wiederum den Inhalt und blendet diesen zum Schließen aus.

Anleitung:
Wenn man die kompilierte Version als Standardanzeiger für die gewünschten Formate unter Windows 10 einstellt (Bilddatei-ReKlick/Öffnen mit/Andere App auswählen/Weitere Apps/Andere App auf diesem PC suchen/...Pixster.exe) sollte man unbedingt zuvor den Haken setzen: Immer diese App zum Öffnen von ... verwenden.
Zum Testen kann man auch die nur die Pixster.ahk ausführen, es wird das ahk-Logo heruntergeladen und eingeblendet. Ihr braucht natürlich auch noch die Gdip_All.ahk > v1.45 von tic https://www.autohotkey.com/boards/viewtopic.php?t=6517

Allerdings habe ich da noch ein Problem und deshalb noch'ne Frage an die AHK-cracks bzgl. der Funktion Gdip_GetImageWidth:
Wenn ich versuche ein Bild unabhängig des Dateityps zu laden und die Dimensionen zu holen, hängt sich AHK auf... das betrifft NUR Bilder, die breiter als A_ScreenWidth sind (200%-Anzeige bei 4K-Monitor).

Ansonsten bin ich für konstruktive Kritik empfänglich... :think:

Code: Select all

;==============================================================================================================================================
; PIXSTER .......: Bilder mit Verpixelung und Ausblendung anzeigen. Bilder > Monitorauflösung werden auf max. Breite/Höhe verkleinert
; unterstützte Dateitypen: bmp, *gif, jpg, *png, *tiff, *ico   (* = transparent)
;==============================================================================================================================================
; AHK Version ...: 1.1.32.0 x64 Unicode
; Win Version ...: Windows 10 Professional x64 / 1909 Build 18363.815
; Version .......: v1.20
; Modified ......: 2020/05/02
; Author(s) .....: moefr01
;==============================================================================================================================================
#NoEnv
#Persistent
#NoTrayIcon
#SingleInstance, Off
SetBatchLines -1
SetWinDelay -1
SendMode Input
SetWorkingDir %A_ScriptDir%
#Include Gdip_All.ahk                       ; Gdip standard library >= v1.45 by tic (Tariq Porter) 07/09/11
                                            ; https://www.autohotkey.com/boards/viewtopic.php?t=6517
If !pToken := Gdip_Startup()
   {
   MsgBox, 48, Gdiplus Fehler!, Gdiplus-Ausführung fehlgeschlagen. Bitte Verfügbarkeit von gdiplus im System sicherstellen!
   ExitApp
   }
OnExit, Exit
;==============================================================================================================================================
file         = %1%                           ; Bilddatei per Doppelklick laden
                                             ; Voraussetzung: Pixster ist kompiliert und standardisiert für o.g. Bild-Dateityp(en)
IfNotExist,  %file%                          ; sonst wird alternativ ahk_logo.png heruntergeladen und angezeigt...
             {
             IfNotExist, %A_ScriptDir%\ahk_logo.png
                         UrlDownloadToFile, https://www.autohotkey.com/static/ahk_logo.png, %A_ScriptDir%\ahk_logo.png
             file = ahk_logo.png
             }
pBitmap      := Gdip_CreateBitmapFromFile(file)         ; Bitmap aus Datei erstellen
Gdip_GetImageDimensions(pBitmap, origW, origH)          ; Bilddimensionen holen
if (origW > A_ScreenWidth) || (origH > A_ScreenHeight)  ; nur wenn Bildgröße > Breite oder Höhe der Bildschirmauflösung ist
   {
   faktorW   := A_ScreenWidth / origW       ; Faktor berechnen aus Breite
   faktorH   := A_ScreenHeight / origH      ; Faktor berechnen aus Höhe
   if (faktorW > faktorH)
      faktor := faktorH
   else
      faktor := faktorW
   sizeW     := origW * faktor              ; neue Bildbreite berechnen
   sizeH     := origH * faktor              ; neue Bildhöhe berechnen
   newBitmap := Gdip_ResizeBitmap(pBitmap, sizeW, sizeH, 0, "7", 0, 1)         ; neue Bitmap mit Größenänderung erstellen
   Gdip_DisposeImage(pBitmap)               ; urspr. Bitmap entsorgen
   pBitmap   := newBitmap                   ; Bitmap aus "resized" festlegen
   origW     *= faktor                      ; urspr. Breite mit Faktor verkleinern
   origH     *= faktor                      ; urspr. Höhe mit Faktor verkleinern
   }
If !pBitmap                                 ; Bitmap-Fehlerabfrage
   {
   MsgBox, 48, Fehler beim Öffnen der Datei!, Das festgelegte Bild kann nicht geladen werden.
   ExitApp
   }
Gui, -Caption +hwndhwnd1 +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop  ; layered GUI erstellen
Gui, Show, , Pixster
WinSet, Region, 0-0 R20-20 w%origW% h%origH%, Pixster   ; Fensterecken abrunden
pBitmapOut   := Gdip_CreateBitmap(origW, origH)         ; Bitmap für die Verpixelung erstellen
hbm          := CreateDIBSection(origW, origH)
hdc          := CreateCompatibleDC()
obm          := SelectObject(hdc, hbm)
G            := Gdip_GraphicsFromHDC(hdc)
UpdateLayeredWindow(hwnd1, hdc, (A_ScreenWidth-origW)//2, (A_ScreenHeight-origH)//2, origW, origH)      ; Fenster zentriert anzeigen
inTile       := 20			                ; Kachel-Startgröße festlegen
outTile      := 1                           ; Kachel-Endgröße festlegen
;==============================================================================================================================================
SetTimer, updateIn, 20                      ; Timer für das Einblenden festlegen
Return
;==============================================================================================================================================
updateIn:                                   ; verpixelt einblenden
if (inTile < 1)
   SetTimer, updateIn, off
Gdip_PixelateBitmap(pBitmap, pBitmapOut, --inTile)
Gdip_GraphicsClear(G)
Gdip_DrawImage(G, pBitmapOut, 0, 0, origW, origH, 0, 0, origW, origH)
UpdateLayeredWindow(hwnd1, hdc)
Return
;==============================================================================================================================================
ESC::
GuiContextMenu:                             ; ESC und Rechtsklick: Timer zum Ausblenden
SetTimer, updateOut, 20                     ; Timer für das Ausblenden festlegen
Return
;==============================================================================================================================================
updateOut:                                  ; verpixelt ausblenden
if (outTile > 20)
   {
   SetTimer, updateOut, off
   Goto Exit
   }
Gdip_PixelateBitmap(pBitmap, pBitmapOut, ++outTile)
Gdip_GraphicsClear(G)
Gdip_DrawImage(G, pBitmapOut, 0, 0, origW, origH, 0, 0, origW, origH)
UpdateLayeredWindow(hwnd1, hdc)
Return
;==============================================================================================================================================
WM_LBUTTONDOWN(wParam, lParam, msg, hWnd)   ; Verschieben per Linksklick... Danke just me!
              {
              static init := OnMessage(0x0201, "WM_LBUTTONDOWN")
              global hwnd1
              if (hWnd = hwnd1)
              DllCall("user32.dll\PostMessage", "ptr", hwnd1, "uint", 0x00A1, "ptr", 2, "ptr", 0)
              }
;==============================================================================================================================================
Exit:                                       ; GUI ausblenden, alles zuvor Erstellte entsorgen und Anwendung schließen
Loop, 17									; Ausblenden mit 17-stufige Transparenz
      {
      trans := 255 - A_Index * 15
      UpdateLayeredWindow(hwnd1, hdc, , , , , trans)
      Sleep, 1
      }
Gdip_DisposeImage(pBitmapOut)
Gdip_DisposeImage(pBitmap)
SelectObject(hdc, obm)
DeleteObject(hbm)
DeleteDC(hdc)
Gdip_DeleteGraphics(G)
Gdip_Shutdown(pToken)
ExitApp
Return
Happy coding und bleibt gesund :thumbup:
:wave: moefr01
Last edited by moefr01 on 02 May 2020, 03:19, edited 6 times in total.
BNOLI
Posts: 548
Joined: 23 Mar 2020, 03:55

Re: Pixster - Bildanzeiger

30 Apr 2020, 01:39

Hi, Danke fürs Teilen :thumbup: ... ich bekomms allerdings unkompilert nicht durchgeführt. Ad-hoc würde ich auf folgendes tippen: ...


... was sich finally als Fehlbedienung herausstellte :roll: ), vorab hatte ich für mich dann doch prompt mal die Eingangssequenz geändert ... :lolno:
... was dann auch funktionierte. So, left it "just for the records" :)
Remember to use [code]CODE[/code]-tags for your multi-line scripts. Stay safe, stay inside, and remember washing your hands for 20 sec !
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

30 Apr 2020, 03:33

Moin,

hast Du mal mit OutputDebugs oder auch MsgBoxen geprüft, wie weit das Skript im Fehlerfall kommt?
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

30 Apr 2020, 04:38

Moin moin,

ich habe das gerade selbst probiert.

Umgebung:
AHK 1.1.32.00 (U64)
Win 10 Pro 1903 64-bit
Bildschirm: 1920x1080
Bild: 3000x2742 (JPG)
Gdip_All.ahk in einer wahrscheinlich von mir veränderten Version.

Nachdem ich mehrfach versucht habe, die Fehlerstelle zu lokalisieren, habe ich es schließlich einfach durchlaufen lassen. Und siehe: Es lief!
Es macht allerdings nicht viel Spaß, sich auf diese Weise Bilder anzusehen, wenn sie deutlich größer als der Bildschirm sind.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

30 Apr 2020, 04:57

moin @just me
habe mich da etwas falsch ausgedrückt: es kommt zu keinem Absturz, sondern Pixster.exe zeigt übergroße Bilder einfach nicht an und der Prozess bleibt hängen (deshalb ExitApp nach msgbox). Gdi_GetImageWidth und Gdi_GetImageHeight liefern korrekte Werte. Wie bereits erwähnt nutze ich eine 4k-Auflösung mit 200% Schriftdarstellung.
:wave: moefr01
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

30 Apr 2020, 05:56

... Eine weitere Überlegung wäre übergroße Bilder im Vorfeld auf die jeweilige systembedingte Auflösung zu resizen und hierbei die Verschiebung mit Linksklick temporär zu deaktivieren.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 08:37

Pixster ist soeben aktualisiert worden. ;)
Das Problem mit den übergroßen Bildern habe ich mit einer Bildgrößenanpassung/berechnung lösen können. Jetzt werden auch Bilder > ScreenWidth/Height verkleinert und komplett sichtbar angezeigt. Das Verschieben habe ich aktiv belassen.
GEÄNDERT: Benutze zum Holen der Breite und Höhe: Gdip_GetImageDimensions und zum Resizen: Gdip_ResizeBitmap.
Der folgene Code-Abschnitt kann entfernt oder natürlich ersetzt werden, er diente eigentlich nur zum Testen:

Code: Select all

IfNotExist, %file%                          ; sonst wird alternativ ahk_logo.png heruntergeladen und angezeigt...
            {
            IfNotExist, %A_ScriptDir%\ahk_logo.png
                        UrlDownloadToFile, https://www.autohotkey.com/static/ahk_logo.png, %A_ScriptDir%\ahk_logo.png
            file = ahk_logo.png
            }
GEÄNDERT: GUI verschieben per Linksklick nach Methode von just me ... Danke :thumbup:

Meine Intension ist Pixster als minimalistischen Bildanzeiger zu verwenden, da ich transparente Bilddateien zwecks besserer Ansicht/Auswahl auf dem Desktop darstellen und frei verschieben möchte... ohne typische Windows-Fensterrahmen oder Zusatzfunktionen, Menüs und tralala.

@BNOLI ... deinen Wunsch zum Beenden per Tastendruck habe ich ebenfalls integriert: ESC-Taste

Happy testing!
:wave: moefr01
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 08:43

Moin,

mein 'übergroßes' Bild wird klaglos angezeigt. Wie groß sind denn Deine 'übergroßen' Bilder im Verhältnis zur Bildschirmgröße?

P.S.: Möglicherweise spielt bei Dir das Bildschirmscaling mit. Hast du es schon mal mit 100 % versucht?
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 08:57

Klarstellung:
... mein 'übergroßes' Bild wird mit dem alten Code klaglos angezeigt.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 08:59

7843 x 4462 ...mit 100% Scaling noch nicht probiert, war ja auch schon anfänglich meine Befürchtung.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:03

:thumbup: :thumbup: :thumbup: soeben mit 100% scaling getestet: gleiche Darstellungsgröße des Bildes wie bei 200%
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:16

Was soll mir das sagen?
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:21

Hoppla... auf meinem anderen Testgerät mit 2560x1440 ist mir noch ein Fehler aufgefallen:
ein Bild mit h > 1440 wurde nicht an die Bildschirmhöhe angepasst!

Code korrigiert: if (origW > A_ScreenWidth) || (origH > A_ScreenHeight)

Pixster-Code werde ich sogleich ändern.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:22

done...
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:30

just me wrote:
01 May 2020, 09:16
Was soll mir das sagen?
es tut das was es soll... den Bildinhalt komplett auf dem Bildschirm darstellen.
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:35

... mit oder ohne interne Größenanpassung?
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 09:44

just me wrote:
01 May 2020, 09:35
... mit oder ohne interne Größenanpassung?
mit der internen Größenanpassung im Pixster-Code und Windows-Skalierung und Anpassung: 100%
just me
Posts: 7158
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 10:03

Hmmm, die Größenbeschränkung ist eh eine gute Idee. Es macht keinen Spaß, mein übergroßes Fenster zu verschieben.

Ich würde Gdip_ResizeBitmap() allerdings nur dann aufrufen, wenn tatsächlich 'resized' werden muss/soll. Es wäre dann auch nicht schlecht, die ursprünglich erstellte Bitmap freizugeben (Gdip_DisposeImage(pBitmap)), bevor pBitmap überschrieben wird.
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

01 May 2020, 10:14

just me wrote:
01 May 2020, 10:03
Hmmm, die Größenbeschränkung ist eh eine gute Idee. Es macht keinen Spaß, mein übergroßes Fenster zu verschieben.

Ich würde Gdip_ResizeBitmap() allerdings nur dann aufrufen, wenn tatsächlich 'resized' werden muss/soll. Es wäre dann auch nicht schlecht, die ursprünglich erstellte Bitmap freizugeben (Gdip_DisposeImage(pBitmap)), bevor pBitmap überschrieben wird.
dispose-code habe ich soeben angepasst... resizing muss ich mir nochmals unter die Lupe nehmen
User avatar
moefr01
Posts: 92
Joined: 25 Nov 2015, 09:01
Location: Germany

Re: Pixster - Bildanzeiger

02 May 2020, 03:25

Pixster-Code soeben aktualisiert:

GEÄNDERT: pBitmap mit Gdip_DisposeImage() vor Neubelegung freigegeben
GEÄNDERT: Gdip_ResizeBitmap() nur bei Bildern anwenden, die größer sind als die native Monitorauflösung bietet

Return to “Skripte und Funktionen”

Who is online

Users browsing this forum: No registered users and 8 guests