簡體   English   中英

WIC“復制像素”調用后預乘像素

[英]Pre-multiply pixels after WIC 'Copy Pixels' call

我一直在尋找創建PARGB32位圖。 要生成與XP后菜單項完全兼容的圖像,這似乎是必需的。

此示例http://msdn.microsoft.com/zh-cn/library/bb757020.aspx?s=6非常有趣,但非常復雜,因為我以前很少使用過OLE接口。 但是,在仔細研究了使用WIC和OLE的代碼段之后,我想我知道它是如何工作的。 讓我感到困惑的一件事是用戶“ David Hellerman”的評論。 總而言之,他指出此示例功能尚未完成。 它不考慮源圖標中的任何潛在alpha信息-如果存在alpha數據,則在掃描ppvBuffer變量時必須逐個像素對其進行預乘。

我的問題分為兩個部分。 當使用WIC而不是GDI時,如何檢測圖標中的alpha數據;如果存在,如何將其預乘到像素中?

從技術上講,該示例代碼是錯誤的,因為在調用CopyPixels時,該示例代碼無法說明或檢查IWICBitmap對象的格式。 創建位圖時,CreateBitmapFromHICON可能始終使用特定格式(該示例表明它是32位PBGRA,但注釋表明它是BGRA),但MSDN並未對此進行記錄,並且依賴它至少是一種不好的形式。 WIC支持許多像素格式,但並非所有像素格式都是32位或RGB。

您可以使用WICConvertBitmapSource函數( http://msdn.microsoft.com/zh-cn/library/windows/desktop/ee719819(v=vs.85).aspx )將數據轉換為特定的已知格式,在這種情況下,您將需要GUID_WICPixelFormat32bppPBGRA(您可能已經習慣於將這種格式寫為PARGB,但是WIC根據字節數組而不是32位int的成分順序使用了一種奇怪的命名約定)。 如果轉換意味着要對數據進行預乘,那么它將做到這一點,但要點是,如果您想要一種特定的格式,則不必擔心它如何到達那里。 您可以以與MSDN示例使用其IWICBitmap相同的方式使用生成的IWICBitmapSource。

您可以使用IWICBitmapSource :: GetPixelFormat( http://msdn.microsoft.com/en-us/library/windows/desktop/ee690181 (v=vs.85) .aspx )確定圖像的像素格式。 但是,通常無法知道alpha數據(如果格式包含alpha數據)是否已預乘,您只需要識別格式GUID。 當我想專門處理多種格式時,通常會使用GetPixelFormat,但對於我不處理的格式,我仍然會使用WICConvertBitmapSource。

編輯:我錯過了你的問題的一部分。 無法基於IWICBitmap來檢測該圖標最初是否具有Alpha通道,因為在所有情況下WIC都會從該圖標創建一個具有Alpha通道的位圖。 這也是不必要的,因為在這種情況下,將Alpha乘以是無操作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM