看板 C_Sharp 關於我們 聯絡資訊
各位大大好 小弟有個訊號處理的問題遇到瓶頸: 我想知道 C# 中如何互相交換影像資料與更改圖檔資料 -------------------------------- 背景敘述如下: 我有個硬體,會將14bit的灰階影像儲存在16bit的tiff影像格式中 我想要將原始資料位移兩個bit如下,希望提高亮度: 0000 1234 5678 9012 變成 0012 3456 7890 1200 以下是我撰寫的程式碼,編譯可以過,但是會跳錯誤 (C++/CLI) http://ideone.com/LZ8fQI 撰寫想法如下: 1. 讀入tiff檔 2. 把tiff檔中的frames取出,並作為 BitmapSource 來源 3. 宣告 Bitmap (PixelFormat::Format16bppGrayScale) 與 BitmapData (我不確定兩者的差異性,bitmap應該是整個檔案,bitmapData應該是指RawData吧?) 4. 把BitmapSource轉存至BitmapData 5. 把BitmapData轉存至ByteArray 6. 把ByteArray轉存至BitArray (BitArray是Class,不是Array) 7. 執行訊號處理 for (int i = 0; i < bitArray->Length; i+=16) { for (int j = 0; j < 12; j++) bitArray[i] = bitArray[i + j + 4]; for (int j = 12; j < 16; j++) bitArray[i] = false; } 8. 把BitArray轉回至ByteArray 9. 把byteArray轉回至bitmapData 10. 最後輸出bitmap ---------------------- 繞了一圈,我覺得我像白癡一樣,因為我很希望直接對tiff的影像做處理 不要在那邊轉來轉去的 而且還不知道錯在哪裡 不知道有沒有先進有遇到相關問題並順利解決的呢? ---------------------- 附加的其他問題 1. bitmap 雖然可以存 16bit灰階 但其 GetPixel(Int32,Int32) SetPixel(Int32,Int32,Color) 的通訊方式是 Color (RGB 8bit) 我不知道該如何使用上述方法於 16bit灰階上 也不知道該怎麼顯示在螢幕上 2. 影像處理方面 using namespace System::Windows::Media::Imaging; using namespace System::Drawing::Imaging; 也不是很熟練,也不知道該怎麼去互轉 雖然我有看到有人把他們用iostream的方式轉存 但這樣轉來轉去實在是 花時間、不直觀 個人很想要直接對原始資料做處理 3. 不太清楚 Bitmap 與 BitmapData 的關係 以上,感謝大家的回應 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.128.115.242 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1489037610.A.803.html
Litfal: https://bitmiracle.com/libtiff/ 不要自己重做輪子 03/09 17:10
s4300026: 感謝樓上回覆 03/11 11:47