簡體   English   中英

無法將圖像轉換為字節[] C#

[英]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.

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