Can';t将图像转换为字节[]C#

Can';t将图像转换为字节[]C#,c#,winforms,image,C#,Winforms,Image,我对将图像保存到数据库这件事非常陌生,即使我认为这很简单,但事实并非如此。我要做的是从同一台计算机上以任何格式读取图像文件,将其显示在图片框中,然后将图像转换为字节以保存在数据库中。到目前为止,我可以在图片框中显示图像,但无法将图像转换为字节。这是我的密码: private void DisplayImage() { if (openFileDialog.ShowDialog(this) == DialogResult.OK) {

我对将图像保存到数据库这件事非常陌生,即使我认为这很简单,但事实并非如此。我要做的是从同一台计算机上以任何格式读取图像文件,将其显示在图片框中,然后将图像转换为字节以保存在数据库中。到目前为止,我可以在图片框中显示图像,但无法将图像转换为字节。这是我的密码:

    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+.

你知道发生了什么吗?

这个特殊的异常通常意味着你试图将图像保存为错误的格式。在代码中指定
ImageFormat.Bmp
-它实际上是位图图像,还是从JPEG或PNG加载的?按照中的指定,尝试保存为与加载的格式不同的格式将失败,并出现
ExternalException


顺便说一句,我不建议将图像存储在数据库中,我相信这里的大多数人都会同意。数据库可能能够处理此任务,但它们没有针对此任务进行优化,最终会影响数据库和应用程序的性能。除非您使用的是SQL Server 2008
FILESTREAM
列,否则在文件系统上存储图像会更有效。

您应该使用原始图像的RawFormat属性作为保存方法的参数,而不是位图的默认值。这将避免图像格式类型错误。例如:

    image.Save(ms, image.RawFormat);

    ms.Position = 0;

    byte [] bytes=ms.ToArray();
我建议实际将图像保存到文件系统,并将文件路径(最好是相对路径)存储在数据库中


数据库中的Blob(即图像等)无法编制索引,通常存储在访问速度较慢的辅助数据库区域中,并会迅速扩大数据库的大小(较慢的备份等)。

您不能简单地读取文件并使用file类将其加载到字节[]中:

byte[] imgData = System.IO.File.ReadAllBytes(@"C:\My Pic\Myfile.jpg");

您可以从打开的对话框中选择图像路径。

回答我自己的问题可能很愚蠢,但我刚刚发现,如果要将图像对象转换为字节,我必须保持原始流处于打开状态。我在另一个我不太记得的页面上看到了这个问题,我通过打开流来测试它,这是真的。所以格式不是问题。但我会采纳你们所有人的建议,将这些图像存储在一个单独的目录中。谢谢你们的帮助,伙计们

问题在于,流必须在映像的生存期内打开,否则将失败

一个对我有效的解决方案就是创建一个图像副本,如下所示:

using (var ms = new MemoryStream(bytes))
{
    _image = new Bitmap(Image.FromStream(ms));
}

错误是否总是发生,或者只是偶尔发生,或者在使用应用程序很长时间后发生?您从未在第一个方法中分配“file”变量。。。我想这只是真实代码的摘录?否则编译器会抱怨“file”变量在赋值之前就被使用了?