Get Image Dimensions without loading the File (WinXP+)

Share your advanced PureBasic knowledge/code with the community.
User avatar
nco2k
Addict
Addict
Posts: 1344
Joined: Mon Sep 15, 2003 5:55 am

Get Image Dimensions without loading the File (WinXP+)

Post by nco2k »

might be useful. :)

although it would be better to detect the real windows version. OSVersion() gets affected by compatibility mode, which is not the desired effect in this case. but thats your homework. :P

Code: Select all

Import "OleAut32.lib"
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    __SysAllocString_(String.p-unicode) As "_SysAllocString"
    __SysFreeString_(*String) As "_SysFreeString"
  CompilerElse
    __SysAllocString_(String.p-unicode) As "SysAllocString"
    __SysFreeString_(*String) As "SysFreeString"
  CompilerEndIf
EndImport

Procedure$ ShellImageDimensions(FileName$)
  Protected Result$, OSVersion, PathPart$, FilePart$, CoInit, *IShellDispatch.IShellDispatch, *SysPathPart, NameSpaceVariant.VARIANT, *Folder.Folder, *FolderItem.FolderItem, ItemDetailsColumn, ItemDetailsVariant.VARIANT, *ItemDetailsBSTR, ItemDetailsBSTRLength, ItemDetailsBSTROffset
  OSVersion = OSVersion()
  If OSVersion >= #PB_OS_Windows_Vista
    ItemDetailsColumn = 31
  ElseIf OSVersion >= #PB_OS_Windows_XP
    ItemDetailsColumn = 26
  EndIf
  If ItemDetailsColumn
    PathPart$ = GetPathPart(FileName$)
    If PathPart$
      FilePart$ = GetFilePart(FileName$)
      If FilePart$
        CoInit = CoInitializeEx_(0, #COINIT_APARTMENTTHREADED | #COINIT_DISABLE_OLE1DDE)
        If CoInit = #S_OK Or CoInit = #S_FALSE Or CoInit & $FFFFFFFF = #RPC_E_CHANGED_MODE & $FFFFFFFF
          If CoCreateInstance_(?CLSID_Shell, 0, #CLSCTX_INPROC_HANDLER | #CLSCTX_INPROC_SERVER | #CLSCTX_LOCAL_SERVER | #CLSCTX_REMOTE_SERVER, ?IID_IShellDispatch, @*IShellDispatch) = #ERROR_SUCCESS
            *SysPathPart = __SysAllocString_(PathPart$)
            If *SysPathPart
              NameSpaceVariant\vt = #VT_BSTR
              NameSpaceVariant\bstrVal = *SysPathPart
              If *IShellDispatch\NameSpace(@NameSpaceVariant, @*Folder) = #ERROR_SUCCESS
                If *Folder\ParseName(FilePart$, @*FolderItem) = #ERROR_SUCCESS
                  ItemDetailsVariant\vt = #VT_DISPATCH
                  ItemDetailsVariant\pdispVal = *FolderItem
                  If *Folder\GetDetailsOf(@ItemDetailsVariant, ItemDetailsColumn, @*ItemDetailsBSTR) = #ERROR_SUCCESS
                    If ItemDetailsColumn = 31
                      ItemDetailsBSTROffset = 2
                    EndIf
                    ItemDetailsBSTRLength = PeekL(*ItemDetailsBSTR - SizeOf(Long)) / 2
                    If ItemDetailsBSTRLength > ItemDetailsBSTROffset
                      Result$ = PeekS(*ItemDetailsBSTR + ItemDetailsBSTROffset, ItemDetailsBSTRLength - ItemDetailsBSTROffset, #PB_Unicode)
                    EndIf
                  EndIf
                  *FolderItem\Release()
                EndIf
                *Folder\Release()
              EndIf
              __SysFreeString_(*SysPathPart)
            EndIf
            *IShellDispatch\Release()
          EndIf
          If CoInit & $FFFFFFFF <> #RPC_E_CHANGED_MODE & $FFFFFFFF
            CoUninitialize_()
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
  ProcedureReturn Result$
  DataSection
    CLSID_Shell:
      Data.l $13709620
      Data.w $C279, $11CE
      Data.b $A4, $9E, $44, $45, $53, $54, $00, $00
    IID_IShellDispatch:
      Data.l $D8F015C0
      Data.w $C278, $11CE
      Data.b $A4, $9E, $44, $45, $53, $54, $00, $00
  EndDataSection
EndProcedure

ImageDimensions$ = ShellImageDimensions(#PB_Compiler_Home+"Examples\Sources\Data\Geebee2.bmp")
Debug ImageDimensions$
Debug "Width: "+StringField(ImageDimensions$, 1, " x ")
Debug "Height: "+StringField(ImageDimensions$, 2, " x ")
c ya,
nco2k
If OSVersion() = #PB_OS_Windows_ME : End : EndIf
User avatar
Demivec
Addict
Addict
Posts: 4091
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: Get Image Dimensions without loading the File (WinXP+)

Post by Demivec »

Thanks for this trick. :)
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5357
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Get Image Dimensions without loading the File (WinXP+)

Post by Kwai chang caine »

Works great here, can be very usefull
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply