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.

Другие вопросы по тегам