Code: Select all
#NoEnv
#SingleInstance, Force
Gui, Margin, 20, 20
OPTIONS := ( SS_BITMAP := 0xE ) | ( SS_CENTERIMAGE := 0x200 )
Gui, Add, Picture, w640 h480 %OPTIONS% Border hwndhwndPic vPicture
Gui, Show,, Image viewer - Just Drag N Drop
Return ; // End of auto-execute section //
GuiDropFiles:
File := StrSplit( A_GuiEvent, "`n" ).1
hBM := LoadPicture( File )
IfEqual, hBM, 0, Return
BITMAP := getHBMinfo( hBM ) ; Extract Width andh height of image
New := ScaleRect( BITMAP.Width, BITMAP.Height, 640, 480 ) ; Derive best-fit W x H for source image
DllCall( "DeleteObject", "Ptr",hBM ) ; Delete Image handle ...
hBM := LoadPicture( File, "GDI+ w" New.W . " h" . New.H ) ; ..and get a new one with correct W x H
GuiControl,, Picture, *w0 *h0 HBITMAP:%hBM%
Return
GuiClose:
GuiEscape:
ExitApp
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
getHBMinfo( hBM ) {
Local SzBITMAP := ( A_PtrSize = 8 ? 32 : 24 ), BITMAP := VarSetCapacity( BITMAP, SzBITMAP )
If DllCall( "GetObject", "Ptr",hBM, "Int",SzBITMAP, "Ptr",&BITMAP )
Return { Width: Numget( BITMAP, 4, "UInt" ), Height: Numget( BITMAP, 8, "UInt" )
, WidthBytes: Numget( BITMAP,12, "UInt" ), Planes: Numget( BITMAP,16, "UShort")
, BitsPixel: Numget( BITMAP,18, "UShort"), bmBits: Numget( BITMAP,20, "UInt" ) }
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ScaleRect( SW, SH, TW, TH, Upscale := 0 ) { ; By SKAN | Created: 19-July-2017 | Topic: goo.gl/
Local SAF := SW/SH, TAF := TW/TH ; Aspect ratios of Source and Target
Return ( !Upscale and SW <= TW and SH <= TH ) ? {W: SW, H: SH}
: ( SAF < TAF ) ? { W: Floor( ( TW / TAF ) * SAF ), H: TH}
: ( SAF > TAF ) ? { W: TW, H: Floor( ( TH / SAF ) * TAF )}
: { W: TW, H: TH }
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -