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...
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
moefr01