GDI kończy się niepowodzeniem konwersji na indeksowany kolor z dokładną paletą?

streszczenie

Używając interfejsu Windows GDI do konwersji 24-bitowego koloru na kolor indeksowany, wydaje się, że GDI wybiera kolory, które są „wystarczająco blisko”, nawet jeśli w dostarczonej palecie są dokładne dopasowania.

Czy ktoś może to potwierdzić jako problem z GDI lub popełniam gdzieś błąd?

Może jest flaga „sprawdź całą paletę dopasowań kolorów”, której nie udało mi się znaleźć?

Uwaga: to jestnie o kwantyzacji. Źródło jest 24-bitowe, ale zawiera 256 lub mniej kolorów, więc dokładna paleta jest banalna do obliczenia. Problem polega na tym, że GDI nie używa pełnej palety.

Obejście problemu

Pracowałem nad tym problemem, mapując kolory, ale wolałbym używać GDI, ponieważ powinien być lepiej zoptymalizowany. Problem polega na tym, że wydaje się „szybki, ale zły”.

Szczegółowy opis

Mój obraz źródłowy jest 24-bitowy, ale używa 256 (lub mniej) kolorów. Wygenerowałem dla niego dokładną paletę i poprosiłem GDI o przeniesienie obrazu na indeksowaną mapę bitową przy użyciu tej palety. W przypadku niektórych pikseli GDI wybiera podobne, ale nie dokładne kolory, nawet jeśli w palecie znajdują się dokładne kolory. To rujnuje gładkie gradienty.

Ten problem występuje z:

UstawDIBitsToDeviceRozciągnięciaBitBltStretchBlt

Problem jestnie dzieje się z:

SetPixel lub SetPixelV w pętli (bardzo wolno!)Używanie własnego kodu do mapowania

Przetestowałem to na:

Windows 7 (sprzęt / sterowniki NVidia)Windows Vista (sprzęt / sterowniki ATI)Windows 2000 (sprzęt / sterowniki VMware)

W każdym teście uzyskuję takie same wyniki. (Nie tylko złe kolory, ale zawsze te same złe kolory.)

Nie sądzę, aby problemem było zarządzanie kolorami (profile ICM / ICC / itd.), Ponieważ większość interfejsów API mówi, że nie używają tego, próbowałem jawnie go wyłączyć zarówno na GDI DC, jak i na V5 nagłówek mapy bitowej i nie sądzę, aby miał on zastosowanie w mojej maszynie wirtualnej vanlilla-Win2k.

Projekt testowy

Kod prostego projektu testowego Win32 / GDI / VS2008 można znaleźć tutaj:

http://www.pretentiousname.com/data/GdiIndexColor.zip

Funkcja Test1 w Win32UI.cpp jest rzeczywistym testem. Posiada dwie tablice RGBQUAD, jeden obraz źródłowy, a drugi dokładną paletę. Sprawdza, czy paleta jest naprawdę dokładna, a następnie prosi GDI o konwersję obrazu przy użyciu API wymienionych powyżej, testując wynik za każdym razem. Dla każdego testu poinformuje Cię o pierwszych niepoprawnych kolorach przed i po pikselu, lub powie, że wszystkie piksele są poprawne, jeśli zadziałały.

Dzięki!

Dziękuję za przeczytanie mojego pytania! Przepraszam, jeśli to wynik tego, że robię coś naprawdę głupiego! :-)

questionAnswers(3)

yourAnswerToTheQuestion