【发布时间】:2013-10-29 16:58:16
【问题描述】:
我在内存中有一个图标(RGB 或我想要的任何格式,通过 PIL/Pillow),我想将它用于
win32gui.Shell_NotifyIcon
这需要HICON。
如何将我的 RGB 像素放入 HICON?
或者,即使这很浪费,我什至不介意通过临时文件进行往返并使用 win32gui.LoadImage 重新加载它,如下所示:
from PIL import Image
#create example image with empty pixels:
img = Image.frombuffer("RGB", (32, 32), "\0"*32*32*3, "raw", "RGB", 0, 1)
img = img.convert("P")
img = img.resize((64, 64), Image.ANTIALIAS)
img.save("C:\\temp.ico", format="bmp")
import win32gui, win32api, win32con
flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
win32gui.LoadImage(None, "C:\\temp.ico", win32con.IMAGE_ICON, 0, 0, flags)
但这失败了:pywintypes.error: (0, 'LoadImage', 'No error message available')
我只是找不到可以写入的图片格式,然后LoadImage 在IMAGE_ICON 模式下可以正确读取和使用它。似乎LoadImage 仅支持该模式下的ICO 文件:我可以将PNG 或BMP 数据读回为IMAGE_BITMAP,但生成的句柄不能被Shell_NotifyIcon 使用。
有没有办法将IMAGE 转换为HICON? (在记忆中)
【问题讨论】:
-
我认为传递给
LoadImage的第三个参数应该是win32con.IMAGE_BITMAP。 -
如果你阅读了整篇文章,你会看到在使用
IMAGE_BITMAP时“结果句柄不能被Shell_NotifyIcon使用”。 -
很抱歉。我读到一些内容说“我不知道这是否适用于所有情况,但在 WinXP 上,.ico 可以是大小为 16x16、32x32 或 64x64 的 bmp。只需将扩展名从 bmp 更改为 ico,您就可以走吧。”
-
如果将 .bmp 扩展名重命名为 .ico 技巧不起作用,我认为你不走运。因为 PIL 只支持读取 .ico 文件。这是一种简单的格式,因此您可以使用标题为 ICO (file format) 的 Wikipedia 文章中的信息编写自己的转换器。
-
@martineau 我已将示例代码更新为使用以“.ICO”扩展名保存的 64x64 图像,但仍然失败并显示“
No error message available”。如果我必须自己编写代码(对于这样一个微不足道的事情!?),那么我宁愿编写避免使用临时文件并直接在内存中创建HICON的代码。
标签: python pywin32 system-tray trayicon loadimage