Re: Resizing an image to fullscreen (à la Windows Desktop)
Posted: Fri Mar 31, 2023 8:04 pm
Yeee
You are QHD idle
Blue win
You are QHD idle
Blue win
http://www.purebasic.com
https://www.purebasic.fr/english/
no not all, but if you run some of my code it will!
Totally agreed.idle wrote: Fri Mar 31, 2023 7:50 pm I think it's time for some wrapper macros to handle this dpi stuff, we shouldn't need to do anything apart from setting a flag.
Code: Select all
Global dpix.d,dpiy.d,asp.d,w.d
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
ExamineDesktops()
Procedure sizeCB()
If IsImage(0)
CopyImage(0,1)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeGadget(0,0,0,WindowWidth(0)*dpix,WindowHeight(0)*dpiy)
ResizeGadget(10,0,0,WindowWidth(0),WindowHeight(0))
ResizeImage(1,w,w/asp)
SetGadgetAttribute(10,#PB_Button_Image,ImageID(1))
EndIf
EndProcedure
flags = #PB_Window_SystemMenu| #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget| #PB_Window_ScreenCentered | #PB_Window_SizeGadget
OpenWindow(0,0,0,400,300,"Right Mouse for Context Menu",Flags)
If CreatePopupImageMenu(0)
MenuItem(1, "Open",LoadImage(10, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(2, "Copy",LoadImage(20, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Copy.png"))
MenuItem(3, "Paste",LoadImage(30, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Paste.png"))
MenuBar()
MenuItem(4, "Save As..",LoadImage(40, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Save.png"))
MenuBar()
OpenSubMenu("Resize Image")
MenuItem(5, "Full Screen",LoadImage(50, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(6, "Normal Screen",LoadImage(60, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
CloseSubMenu()
MenuBar()
MenuItem( 7, "Quit",LoadImage(70, #PB_Compiler_Home + "examples/sources/Data/ToolBar/New.png"))
EndIf
ContainerGadget(0,0,0,WindowWidth(0),WindowHeight(0))
ButtonImageGadget(10,0,0,WindowWidth(0),WindowHeight(0),0)
CloseGadgetList()
DisableGadget(0,1)
BindEvent(#PB_Event_SizeWindow,@sizeCB())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Timer
Case #PB_Event_RightClick
DisplayPopupMenu(0, WindowID(0),DesktopMouseX(),DesktopMouseY())
Case #PB_Event_Menu
Select EventMenu()
Case 1
Filename$ = OpenFileRequester("Image", "", "Image|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tiff", 0)
If FileSize(Filename$) >= 0
result = LoadImage(0,Filename$)
If result
CopyImage(0,1)
asp = ImageWidth(0)/ImageHeight(0)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeImage(1,w,w/asp)
SetGadgetAttribute(10, #PB_Button_Image,ImageID(1))
EndIf
Else
MessageRequester("Error","No image loaded",#MB_OK)
EndIf
Case 2
If IsImage(1)
SetClipboardImage(1)
EndIf
Case 3
If GetClipboardImage(0)
CopyImage(0,1)
ResizeImage(1,w,w/asp)
SetGadgetAttribute(10, #PB_Button_Image,ImageID(1))
EndIf
Case 4
If IsImage(1)
imgH = GetGadgetAttribute(10,#PB_Button_Image)
CreateImage(10,ImageWidth(1),ImageHeight(1),24)
StartDrawing(ImageOutput(10))
DrawImage(imgH,0,0)
StopDrawing()
SaveImage(10,GetTemporaryDirectory()+"Test.bmp")
FreeImage(10)
EndIf
Case 5
nx = WindowX(0)
ny = WindowY(0)
nw = WindowWidth(0)
nh = WindowHeight(0)
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)&~ #WS_THICKFRAME &~ #WS_DLGFRAME)
ResizeWindow(0,0,0,DesktopWidth(0),DesktopHeight(0))
Case 6
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)|#WS_THICKFRAME | #WS_DLGFRAME)
ResizeWindow(0,nx,ny,nw,nh)
Case 7
End
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case 1
EndSelect
EndSelect
Until Quit = 1
End
No, no Rashad. No hijacking charge will be levied here.
I think that he will be happy about itRASHAD wrote: Sat Apr 01, 2023 8:07 am Hi ZX80
It looks to me that we are hijacking Blue post now![]()
Next snippet with Aspect Ratio
+1000idle wrote: Fri Mar 31, 2023 7:50 pm I think it's time for some wrapper macros to handle this dpi stuff, we shouldn't need to do anything apart from setting a flag.
Code: Select all
Global dpix.d,dpiy.d,asp.d,w.d,scale.f
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
ExamineDesktops()
Procedure sizeCB()
If IsImage(0)
CopyImage(0,1)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeImage(1,w,w/asp)
ResizeGadget(0,0,0,WindowWidth(0)*dpix,WindowHeight(0)*dpiy)
StartDrawing(CanvasOutput(0))
Box(0,0,WindowWidth(0),WindowHeight(0),$FFFFFF)
DrawImage(ImageID(1),(GadgetWidth(0)-ImageWidth(1))/2,(GadgetHeight(0)-ImageHeight(1))/2,ImageWidth(1),ImageHeight(1))
StopDrawing()
scale = 1
EndIf
EndProcedure
flags = #PB_Window_SystemMenu| #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget| #PB_Window_ScreenCentered | #PB_Window_SizeGadget
OpenWindow(0,0,0,400,300,"Right Mouse for Context Menu",Flags)
If CreatePopupImageMenu(0)
MenuItem(1, "Open",LoadImage(10, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(2, "Copy",LoadImage(20, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Copy.png"))
MenuItem(3, "Paste",LoadImage(30, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Paste.png"))
MenuBar()
MenuItem(4, "Save As..",LoadImage(40, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Save.png"))
MenuBar()
OpenSubMenu("Resize Image")
MenuItem(5, "Full Screen",LoadImage(50, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(6, "Normal Screen",LoadImage(60, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
CloseSubMenu()
MenuBar()
MenuItem( 7, "Quit",LoadImage(70, #PB_Compiler_Home + "examples/sources/Data/ToolBar/New.png"))
EndIf
CanvasGadget(0,0,0,WindowWidth(0),WindowHeight(0))
BindEvent(#PB_Event_SizeWindow,@sizeCB())
scale.f = 1
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Menu
Select EventMenu()
Case 1
Filename$ = OpenFileRequester("Image", "", "Image|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tiff", 0)
If FileSize(Filename$) >= 0
result = LoadImage(0,Filename$)
If result
CopyImage(0,1)
asp = ImageWidth(0)/ImageHeight(0)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeImage(1,w,w/asp)
ResizeGadget(0,0,0,WindowWidth(0)*dpix,WindowHeight(0)*dpiy)
StartDrawing(CanvasOutput(0))
Box(0,0,WindowWidth(0),WindowHeight(0),$FFFFFF)
DrawImage(ImageID(1),(GadgetWidth(0)-ImageWidth(1))/2,(GadgetHeight(0)-ImageHeight(1))/2,ImageWidth(1),ImageHeight(1))
StopDrawing()
EndIf
Else
MessageRequester("Error","No image loaded",#MB_OK)
EndIf
Case 2
If IsImage(1)
SetClipboardImage(1)
EndIf
Case 3
If GetClipboardImage(0)
CopyImage(0,1)
ResizeImage(1,w,w/asp)
StartDrawing(CanvasOutput(0))
Box(0,0,WindowWidth(0),WindowHeight(0),$FFFFFF)
DrawImage(ImageID(1),(GadgetWidth(0)-ImageWidth(1))/2,(GadgetHeight(0)-ImageHeight(1))/2,ImageWidth(1),ImageHeight(1))
StopDrawing()
EndIf
Case 4
If IsImage(1)
StartDrawing(CanvasOutput(0))
GrabDrawingImage(0,(GadgetWidth(0)-ImageWidth(1))/2,(GadgetHeight(0)-ImageHeight(1))/2,ImageWidth(1),ImageHeight(1))
StopDrawing()
SaveImage(0,GetTemporaryDirectory()+"Test.bmp")
FreeImage(0)
EndIf
Case 5
nx = WindowX(0)
ny = WindowY(0)
nw = WindowWidth(0)
nh = WindowHeight(0)
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)&~ #WS_THICKFRAME &~ #WS_DLGFRAME)
ResizeWindow(0,0,0,DesktopWidth(0),DesktopHeight(0))
Case 6
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)|#WS_THICKFRAME | #WS_DLGFRAME)
ResizeWindow(0,nx,ny,nw,nh)
Case 7
End
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Select EventType()
Case #PB_EventType_RightButtonDown
DisplayPopupMenu(0, WindowID(0),DesktopMouseX(),DesktopMouseY())
Case #PB_EventType_MouseWheel
If IsImage(0)
Value.f = GetGadgetAttribute(0,#PB_Canvas_WheelDelta )/10
Scale = scale + value
If scale > 3
scale = 3
EndIf
If scale < 0.2
scale = 0.2
EndIf
CopyImage(0,1)
ResizeImage(1,w,w/asp)
ResizeWindow(0,#PB_Ignore,#PB_Ignore,WindowWidth(0)*scale,WindowHeight(0)*scale)
ResizeGadget(0,0,0,WindowWidth(0),WindowHeight(0))
StartDrawing(CanvasOutput(0))
Box(0,0,WindowWidth(0),WindowHeight(0),$FFFFFF)
DrawImage(ImageID(1),(WindowWidth(0)*dpix-ImageWidth(1))/2,(WindowHeight(0)*dpiy-ImageHeight(1))/2,ImageWidth(1),ImageHeight(1))
StopDrawing()
EndIf
EndSelect
EndSelect
EndSelect
Until Quit = 1
End
You're full of surprises — and good ideas ! — RashadRASHAD wrote: Sat Apr 01, 2023 8:07 am Hi ZX80
It looks to me that we are hijacking Blue post now![]()
Next snippet with Aspect RatioCode: Select all
[...] ContainerGadget(0,0,0,WindowWidth(0),WindowHeight(0)) ButtonImageGadget(10,0,0,WindowWidth(0),WindowHeight(0),0) CloseGadgetList() [...]
Code: Select all
Global dpix.d,dpiy.d,asp.d,w.d
dpix = DesktopResolutionX()
dpiy = DesktopResolutionY()
UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
ExamineDesktops()
Procedure sizeCB()
If IsImage(0)
CopyImage(0,1)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeImage(1,w,w/asp)
ResizeGadget(0,0,0,WindowWidth(0)*dpix,WindowHeight(0)*dpiy)
ResizeGadget(10,(GadgetWidth(0)-ImageWidth(1))/dpix/2,(GadgetHeight(0)-ImageHeight(1))/dpiy/2,ImageWidth(1),ImageHeight(1))
SetGadgetState(10,ImageID(1))
EndIf
EndProcedure
flags = #PB_Window_SystemMenu| #PB_Window_MaximizeGadget| #PB_Window_MinimizeGadget| #PB_Window_ScreenCentered | #PB_Window_SizeGadget
OpenWindow(0,0,0,400,300,"Right Mouse for Context Menu",Flags)
;WindowBounds(0,200,150,1920,1080)
If CreatePopupImageMenu(0)
MenuItem(1, "Open",LoadImage(10, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(2, "Copy",LoadImage(20, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Copy.png"))
MenuItem(3, "Paste",LoadImage(30, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Paste.png"))
MenuBar()
MenuItem(4, "Save As..",LoadImage(40, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Save.png"))
MenuBar()
OpenSubMenu("Resize Image")
MenuItem(5, "Full Screen",LoadImage(50, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
MenuItem(6, "Normal Screen",LoadImage(60, #PB_Compiler_Home + "examples/sources/Data/ToolBar/Open.png"))
CloseSubMenu()
MenuBar()
MenuItem( 7, "Quit",LoadImage(70, #PB_Compiler_Home + "examples/sources/Data/ToolBar/New.png"))
EndIf
ContainerGadget(0,0,0,WindowWidth(0),WindowHeight(0))
SetGadgetColor(0,#PB_Gadget_BackColor,0)
ImageGadget(10,0,0,0,0,0)
CloseGadgetList()
DisableGadget(0,1)
BindEvent(#PB_Event_SizeWindow,@sizeCB())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_RightClick
DisplayPopupMenu(0, WindowID(0),DesktopMouseX(),DesktopMouseY())
Case #PB_Event_Menu
Select EventMenu()
Case 1
Filename$ = OpenFileRequester("Image", "", "Image|*.bmp;*.jpg;*.jpeg;*.png;*.gif;*.tiff", 0)
If FileSize(Filename$) >= 0
result = LoadImage(0,Filename$)
If result
CopyImage(0,1)
asp = ImageWidth(0)/ImageHeight(0)
If asp >= 1
w = WindowWidth(0)*dpiy
Else
w = WindowHeight(0)*dpiy*asp
EndIf
ResizeImage(1,w,w/asp)
ResizeGadget(0,0,0,WindowWidth(0)*dpix,WindowHeight(0)*dpiy)
ResizeGadget(10,(GadgetWidth(0)-ImageWidth(1))/dpix/2,(GadgetHeight(0)-ImageHeight(1))/dpiy/2,ImageWidth(1),ImageHeight(1))
SetGadgetState(10,ImageID(1))
EndIf
Else
MessageRequester("Error","No image loaded",#MB_OK)
EndIf
Case 2
If IsImage(1)
SetClipboardImage(1)
EndIf
Case 3
If GetClipboardImage(0)
CopyImage(0,1)
ResizeImage(1,w,w/asp)
SetGadgetState(10,ImageID(1))
EndIf
Case 4
If IsImage(1)
SaveImage(1,GetTemporaryDirectory()+"Test.bmp")
FreeImage(1)
EndIf
Case 5
nx = WindowX(0)
ny = WindowY(0)
nw = WindowWidth(0)
nh = WindowHeight(0)
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)&~ #WS_THICKFRAME &~ #WS_DLGFRAME)
ResizeWindow(0,0,0,DesktopWidth(0),DesktopHeight(0))
Case 6
SetWindowLongPtr_(WindowID(0), #GWL_STYLE, GetWindowLongPtr_(WindowID(0), #GWL_STYLE)|#WS_THICKFRAME | #WS_DLGFRAME)
ResizeWindow(0,nx,ny,nw,nh)
Case 7
End
EndSelect
EndSelect
Until Quit = 1
End
No, Rashad : I’m fully aware of how tricky DPi conformity can get. However, I’ve had it tamed and well under control for quite a while now. My problem is not there: where I keep tripping over the flowers in the carpet is in image manipulation. That’s why this ongoing exercise is important and interesting for me.RASHAD wrote: Sun Apr 02, 2023 4:09 pm Hi Blue
The DPI scaling is more complicated than you think![]()
[…]Code: Select all
[…] Procedure sizeCB() […] ResizeImage(1,w,w/asp) <<<— this is what I was not doing right ! […] EndProcedure