簡體   English   中英

從Visual Studio C#中的MS Access數據庫中獲取OLE(位圖)對象形式,我的代碼有什么問題?

[英]Taking OLE (bitmap) object form MS Access database in Visual studio C# , What's wrong in my code?

我正在嘗試從MS Access DB獲取圖像。 數據已正確提取,但是當我嘗試顯示一些錯誤時顯示。 我用於顯示圖像的代碼是

            ...
            byte[] photoBytes = (byte[])res[11];
            var ms = new System.IO.MemoryStream(photoBytes);
            image.Image = new System.Drawing.Bitmap(ms);
            ...

錯誤: 附加信息:參數無效。 在此處輸入圖片說明

誰能告訴我錯誤在哪里,或者錯誤的概率在哪里?

我的功能是

public OleDbDataReader studentInfo(String adm_no)
    {
        OleDbConnection con = new OleDbConnection(ConnStr);
        con.Open();
        OleDbCommand command = new OleDbCommand("SELECT * FROM student_info WHERE adm_no = '"+adm_no+"'", con);
        OleDbDataReader res = command.ExecuteReader();
        return res;
    }

據我所記得,OLE是野獸。 如果您確定知道數據類型是什么,則可以檢查一下其二進制結構。 OLE是一個容器,因此IMO絕不僅僅是純內容。

我沒有代碼了,但是我記得在不同類型的OLE(Excel,Word,Textfiles,Images ...)的十六進制轉儲中釣魚,最終成功率高達80%。 如果是因為我們決定支持的類​​型,或者由於我對OLE的內部結構的了解非常有限,我將無法再說了。

我的調試建議是,在處理二進制數據之前,絕對要確保您具有原始位圖數據:

我的方法是創建一個小對象(在本例中為位圖),將其存儲在DB中,獲取它的BLOB並在其中查找已知模式。 我記得我通過逆向工程發現了一些結構(例如搜索對象的字節大小),並且在數據開始時有一定的偏移量。

但是,如果您碰巧知道-甚至更好- 具有 OLE對象的確切結構和實現並能夠處理它,我絕對有信心您還將設法將其存儲並以位圖的形式打開。

祝好運!

此處查看您要嘗試執行的操作的示例,盡管該示例是針對JPEG而非位圖的。 由於您具有byte[] ,因此需要執行以下操作進行轉換:

using (MemoryStream ms = new MemoryStream(photoBytes))
{
  Bitmap img = (Bitmap)Image.FromStream(ms);
}

您的字節流有問題。 通常,我會說在將MemoryStream.Position傳遞給Bitmap構造函數之前檢查是否將其設置為0-如果它位於流的末尾,則可能是有效地傳遞了一個空流-但這不應該這里不是這樣。

構造函數中有一些地方會引發參數異常,但是InvaildParameter應該與所獲取的字節流有問題有關。 參見此處: https : //referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Bitmap.cs,cbbb65af7f6fafdb,參考

此處: https//referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Gdiplus.cs,4edcade52d698713

您應該驗證您的字節流是否適合GDI +格式,以便能夠作為圖像加載-例如,嘗試將字節寫出到文件中並在Paint中打開它。

暫無
暫無

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

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