win32api: получить растровую палитру - PullRequest
0 голосов
/ 05 января 2011

Я в основном делаю это , но для 8-битной. Я могу правильно получить битовые биты, используя «P» в качестве бита режима. Однако у меня есть все эти битовые биты, но нет палитры - PIL просто использует палитру серой шкалы по умолчанию. Как мне получить правильную палитру с картинки?

Ответы [ 2 ]

1 голос
/ 05 января 2011

Я не уверен, как преобразовать вызовы Windows API в Python, и при этом я не знаю, как обновить палитру в PIL, но здесь идет речь.

Для растровых изображений Windows не привязана цветовая палитраих.Палитра выбирается в DC и объединяется с зарезервированными системными цветами;затем растровое изображение отображается с использованием текущей выбранной палитры.

Если у вас есть DC, вы можете получить текущую реализованную палитру, используя GetSystemPaletteEntries .

0 голосов
/ 05 января 2011

Это работает, возвращая 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
...