How to extract 32x32 icon bitmap data from EXE and convert it into a PIL Image object?

前端 未结 1 647
无人及你
无人及你 2021-01-25 15:49

I\'m trying to extract a 32x32 icon from an EXE, and convert the bitmap data into an PIL Image object. My final goal is to compare the icon to another 32x32 PNG and

1条回答
  •  醉话见心
    2021-01-25 16:25

    From a mailing list here, I found this code snippet:

    import win32ui
    import win32gui
    import win32con
    import win32api
    
    ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
    ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)
    
    large, small = win32gui.ExtractIconEx("C:\Program Files (x86)\Malwarebytes' Anti-Malware\mbam.exe",0)
    win32gui.DestroyIcon(small[0])
    
    hdc = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
    hbmp = win32ui.CreateBitmap()
    hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_x )
    hdc = hdc.CreateCompatibleDC()
    
    hdc.SelectObject( hbmp )
    hdc.DrawIcon( (0,0), large[0] )
    
    hbmp.SaveBitmapFile( hdc, 'icon.bmp')  
    

    From there, you could load it into PIL in the normal Image.open fashion.

    If you dig through the docs, you should be able to avoid the IO step and do it all in memory if you want. PIL has a from frombuffer method that you can use to convert the result of GetBitmapBits to an Image object.

    0 讨论(0)
提交回复
热议问题