qwert

Attempting to scroll large PNG

5 posts in this topic

#1 ·  Posted

I'm afraid I've been looking at this too long.  I'm certain something is missing, but I can't see what.

My mission is to display a large PNG in a window with scroll bars.  When the PNG would not display, I backed down to displaying a JPG as a picture.  It also fails to show.

Here's what I have ... simplified to display a wallpaper from the OS:

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "GUIScrollbars_Ex.au3"
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#Include <GDIPlus.au3>
#include <WindowsConstants.au3>
;#NoTrayIcon

$File = "C:\Windows\Web\Wallpaper\Windows\img0.jpg"

$wide = Round((@DesktopWidth / 7) * 5, 0)
$tall = Round(@DesktopHeight * 0.9, 0)

$hGUI = GUICreate("View Large Image", $wide, $tall)
GUISetState()

_GDIPlus_Startup()
$hImage =  _GDIPlus_ImageLoadFromFile($File)                    ; determine the size of the image
$Width = _GDIPlus_ImageGetWidth($hImage)
$Height = _GDIPlus_ImageGetHeight($hImage)

$hChild_GUI = GUICreate("Child", $wide, $tall, 0, 0, $WS_POPUP, $WS_EX_MDICHILD, $hGUI)

$Pic1 = GUICtrlCreatePic("", -1, -1, $Width, $Height)
GUICtrlSetImage(-1, $File)                                      ; << this should work for a JPG
;_SetBitmap($hChild_GUI, $hImage, 255, $Width, $Height)     ; << this is required for PNGs
GUISetState()

$aAperture = _GUIScrollbars_Generate($hChild_GUI , $Width , $Height)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            _GDIPlus_ImageDispose($hImage)
            _GDIPlus_ShutDown ()
            Exit
    EndSwitch
WEnd

Func _SetBitmap($hGUI, $hImage, $iOpacity, $n_width = 200, $n_height = 200)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $n_width)
    DllStructSetData($tSize, "Y", $n_height)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", 1)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
EndFunc   ;==>_SetBitmap

Thanks in advance for any nudge.

 

 

 

Share this post


Link to post
Share on other sites



#3 ·  Posted

Good point!  That single change enables the JPG to display.  And the scrollbars work as expected.

Any ideas on how to make the PNG method work?  The reason I used a child window is that GUIScrollbars_Generate seemed to require it.

Thanks for your response.

 

Share this post


Link to post
Share on other sites

#4 ·  Posted

11 minutes ago, qwert said:

how to make the PNG method work

Try to use function _GUICtrlPic_Create() from example to function _GDIPlus_BitmapCreateDIBFromBitmap() from help file

; $Pic1 = GUICtrlCreatePic("", -1, -1, $Width, $Height)
; GUICtrlSetImage(-1, $File)
$Pic1 = _GUICtrlPic_Create($File, 0, 0, $Width, $Height)

 

Share this post


Link to post
Share on other sites

#5 ·  Posted

Quote

_GDIPlus_BitmapCreateDIBFromBitmap()

Indeed, that works.  It is not a method I had ever noticed.  I appreciate your help with this ... and I'm glad to have both JPG and PNG methods working.

But, alas, I have again run upon an internal hard limit on the size of images.  The PNG method will display an image with a height of 30,000 pixels, but not one with 36,000 pixels.  I had previously found that JPGs are limited to about 25,000 pixels and was hoping that a PNG was not restricted. 

But my testing now confirms that there is a limit.  I don't know if it's a limit in the vertical dimension ... or a limit in total pixels ... and if there's any setting that can increase the limit.

Can anyone point to documentation for Au3?  Checking Internet sources did not yield a definitive answer for PNGs, only for JPGs.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now