[英]Can't convert image to bytes[] C#
我對這個向DB保存圖像的東西很新,即使我認為它非常直接,但事實並非如此。 我要做的是從任何格式的同一台計算機讀取和圖像文件,將其顯示在圖片框中,然后將圖像轉換為字節以將其保存在數據庫中。 到現在為止,我可以在圖片框中顯示圖像,但我無法將圖像轉換為字節。 這是我的代碼:
private void DisplayImage()
{
if (openFileDialog.ShowDialog(this) == DialogResult.OK)
{
try
{
Stream file;
if ((archivo = openFileDialog.OpenFile()) != null)
{
using (file)
{
pictureBox.Image = Image.FromStream(file);
}
}
}
catch (Exception ex)
{
...
}
}
}
這是一種只在圖片框中顯示圖像的簡單方法。 真正的問題是使用以下方法:
public static byte[] ConvertImageToBytes(Image image)
{
if (image != null)
{
MemoryStream ms = new MemoryStream();
using (ms)
{
image.Save(ms, ImageFormat.Bmp);
byte[] bytes = ms.ToArray();
return bytes;
}
}
else
{
return null;
}
}
當它試圖將圖像保存到內存流時,我收到錯誤:
System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+.
關於發生了什么的任何想法?
您應該使用原始圖像的RawFormat屬性作為Save方法的參數,而不是默認為Bitmap。 這樣可以避免圖像格式類型錯誤。 例如:
image.Save(ms, image.RawFormat);
ms.Position = 0;
byte [] bytes=ms.ToArray();
我建議實際將圖像保存到文件系統,並簡單地將文件路徑(最好是相對的)存儲在數據庫中。
數據庫中的BLOB(即圖像等)無法編入索引,通常存儲在輔助的較慢訪問數據庫區域中,並且會快速耗盡數據庫的大小(較慢的備份等)。
你不能簡單地讀取文件並使用File類將其加載到byte []:
byte[] imgData = System.IO.File.ReadAllBytes(@"C:\My Pic\Myfile.jpg");
您可以從“打開”對話框中選擇圖像路徑。
該特殊異常通常意味着您嘗試將圖像保存為錯誤的格式。 在你的代碼中你指定ImageFormat.Bmp
- 它實際上是一個位圖圖像,或者你是否可以從JPEG或PNG加載它? 嘗試以與您加載的格式不同的格式保存將因ExternalException
而失敗,如文檔中所指定。
順便說一句,我不建議將圖像存儲在數據庫中,我相信這里的大多數人會同意。 數據庫可能能夠處理此任務,但它們沒有針對它進行優化,最終會損害數據庫和應用程序的性能。 除非您使用的是SQL Server 2008 FILESTREAM
列,否則將圖像存儲在文件系統上會更有效。
回答我自己的問題可能是愚蠢的,但我發現如果我想將Image對象轉換為字節,我必須保持原始流打開。 我在另一個頁面中看到了這個問題,我不記得了,我通過打開流來測試它,這是真的。 所以格式不是問題。 但我會接受你們所有人的建議並將圖像存儲在一個單獨的目錄中。 謝謝你的幫助!
這個問題是流必須在圖像的生命周期內打開,否則將失敗。
一個對我有用的解決方案就是創建一個像這樣的圖像副本:
using (var ms = new MemoryStream(bytes))
{
_image = new Bitmap(Image.FromStream(ms));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.