win32api: получить растровую палитру
Я в основном делаю это, но для 8-битной. Я могу правильно получить битовые биты, используя "P" в качестве бита режима. Однако у меня есть все эти битовые биты, но нет палитры - PIL просто использует палитру серой шкалы по умолчанию. Как мне получить правильную палитру с картинки?
2 ответа
Это работает, возвращая PIL-совместимую палитру:
import ctypes, win32gui
def getSystemPalette():
hwnd = win32gui.GetDesktopWindow()
hwndDC = win32gui.GetWindowDC(hwnd)
buff = ctypes.c_buffer("0"*(256*4)) #R, G, B, and flags
ctypes.windll.gdi32.GetSystemPaletteEntries(hwndDC, 0, 256, buff)
win32gui.ReleaseDC(hwnd, hwndDC)
#ignore every 4th entry which is the flags
res = [ord(x) for i,x in enumerate(buff) if i%4 != 3]
return res
Я не уверен, как преобразовать вызовы API Windows в Python, и при этом я не знаю, как обновить палитру в PIL, но здесь идет.
Для растровых изображений Windows не привязана цветовая палитра. Палитра выбирается в DC и объединяется с зарезервированными системными цветами; затем растровое изображение отображается с использованием текущей выбранной палитры.
Если у вас есть DC, вы можете получить текущую реализованную палитру, используя GetSystemPaletteEntries.