Schowek Win32 i obrazy kanału alfa

Moja aplikacja powinna być w stanie skopiować obrazy 32-bitowe (kanał RGB + alfa) do schowka i wkleić te obrazy ze schowka. W tym celu zamierzam użyćCF_DIBV5 ponieważBITMAPV5HEADER struktura ma polebV5AlphaMask.

Problem polega na tym, że wydaje się, że nie ma zgody co do tego, jak dokładnie dane obrazu powinny być przechowywane w schowku. Podczas przeprowadzania niektórych testów odkryłem, że istnieje kilka różnic między aplikacjami, co sprawia, że ​​nie jest możliwe wymyślenie ogólnego rozwiązania.

Oto moje obserwacje:

Kiedy kopiuję obraz kanału alfa z Word 2010 lub XnView do schowka, jest on przechowywany bez przedultipulowania danych pikseli.

Jednak gdy kopiuję obraz za pomocą przeglądarki Firefox lub Chrome, dane pikseli wydają się być wstępnie zwielokrotnione przez kanał alfa.

Zestawy FirefoxbV5AlphaMask na 0xff000000, podczas gdy większość innych aplikacji nie ustawia tego w ogóle, ale zachowuje 0. Jest to dziwne, ponieważ te aplikacje umieszczają DIB w schowku, który faktycznie zawiera kanał alfa w najwyższych 8 bitach, ale nadal ustawiająbV5AlphaMask do 0. Trzeba więc założyć, że jeśli głębokość bitowa wynosi 32, to istnieje kanał alfa, nawet jeślibV5AlphaMask jest 0.

Krótko mówiąc, moje podstawowe pytanie brzmi: czy są jakieś oficjalne informacje dotyczące sposobu przechowywania danych kanału alfa w schowku? Jestem szczególnie zainteresowany, aby dowiedzieć się, czy dane muszą być przedwczesne. Jak widać powyżej, Word 2010 i XnView nie działają przedwcześnie, podczas gdy Firefox i Chrome to robią. Jednak bardzo ważne jest, aby wiedzieć, czy kanały kolorów powinny być przedwczesne.

Wielkie dzięki za rzucenie na to trochę światła!

AKTUALIZACJA 2 Wklejanie do Paint.NET działa teraz dobrze. Spowodowane to było błędem w moim kodzie, który nie ustawił kanałów kolorów na 0, jeśli kanał alfa był równy 0, tj. Przedwczesna replikacja nie została wykonana poprawnie w tym przypadku, co zdaje się mylić Paint.NET.

Nadal nierozwiązany jest problem z programem Internet Explorer 10. Podczas kopiowania PNG z kanałem alfa do schowka, IE 10 po prostu umieszcza 24-bitowy CF_DIBV5 w schowku, ale Paint.NET może wkleić tę bitmapę Z kanałem alfa, więc musi istnieć inny format że IE 10 udostępnia schowek. Może ujawnia PNG używa CFSTR_FILECONTENTS i CFSTR_FILEDESCRIPTOR.

AKTUALIZACJA Zaimplementowałem go teraz w sposób opisany przez arx poniżej i działa całkiem dobrze. Jednak wciąż są dwie rzeczy, które mnie zastanawiają:

1) Wklejanie obrazów kanału alfa z mojej aplikacji do Paint.NET nie zachowuje kanału alfa. Obraz jest nieprzezroczysty w Paint.NET. Jednak wklejenie z Firefoksa i Chrome do Paint.NET działa doskonale, kanał alfa jest zachowany! Zrzuciłem cały DIBV5 i jest on identyczny z moją aplikacją, ale nadal działa z FF i Chrome, ale nie z moją aplikacją, więc musi być coś innego! Firefox i Chrome muszą robić coś innego niż moja aplikacja nie działa !?

2) To samo dotyczy Internet Explorer 10. Wklejanie obrazu kanału alfa z IE 10 do mojej aplikacji w ogóle nie działa ... Dostaję DIB, który ma 24-bitową głębię, tj. Nie ma kanału alfa w wszystko. Jednak wklejając z IE 10 do Paint.NET, istnieje kanał alfa! Więc musi tu być coś więcej ...

questionAnswers(2)

yourAnswerToTheQuestion