2010-08-23 41 views
1

下面的代碼(來自此主題:How to use Delphi 2010's new WIC capability on Canon files?)將WIC圖像打開成BitMap。但是,如果WIC像素值的動態範圍很大,則該代碼會丟失大量信息,因爲它必須將寬動態範圍縮放到位圖像素可以容納的低範圍。如何閱讀WIC圖像中的像素

procedure TForm116.Button1Click(Sender: TObject); 
var 
    WIC: TWICImage; 
begin 
    WIC := TWICImage.Create; 
    try 
    WIC.LoadFromFile('MyFilename.raw'); 
    Image1.Picture.Graphic.Assign(WIC); 
    finally 
    WIC.Free; 
    end; 
end; 

誰能告訴我的示例代碼,它可以讓我直接從TWICImage讀出的像素值,所以不會丟失信息我可以訪問圖像數據嗎?我需要每個像素的亮度(灰度)值,如果不能直接使用,可能可以從RGB值計算出來?

喜歡的東西:

var 
    PixelValue: Integer; // Grayscale 

for Row := 0 to WIC.Width do 
    for Col := 0 to WIC.Height 
    PixelValue := WIC.GetPixelValue(Row, Col); 

回答

0

你應該能夠assign()的TWICImage到TBitmap,然後訪問位圖的像素或者掃描屬性來獲取的像素數據。就像加載JPEG時你所做的一樣。

例如(未測試的僞代碼)

w := TWICImage.Create(); 
w.LoadFromFile(...) 
b := TBitmap.Create; 
b.assign(w); 
ptr := b.ScanLine[...] 
+0

正如我注意到(或許不正確地)在原來的職位,在TBitMap的像素具有從0..255的範圍內(作爲返回,例如,通過掃描線在一個PByteArray。)一個WIC圖像,但是,可以有像素的值在成千上萬或更多... 庫代碼調用(在我的原始文章)Image1.Picture.Graphic.Assign WIC)將較大範圍(比如0..10000)縮放到(0..255),因此失去了很多細節。 – RobertFrank 2010-08-23 19:58:51

+0

位圖可以有許多不同的顏色深度,從單色(1位)到更常見的24/32位(4字節,20億collors)甚至更高。那麼對於24位或32位位圖的顏色值是一個32位整數 - 遠遠超過0-255。我認爲你的誤解是,對於32位位圖,它的單個顏色分量的範圍是0-255,而不是像素。要獲得灰度值,您可以通過您選擇的功能發送這些顏色分量,以生成0-255灰度值。 – GrandmasterB 2010-08-23 20:55:01

+0

加農炮原始文件可能是高動態範圍圖像(曝光等),其中可能包括完整的浮點頻譜。這些文件在Delphi支持的任何格式(或顯示器)上都沒有1:1映射。在這種情況下,要查找的關鍵字是_tone mapping_。 – 2010-08-24 13:10:49