Не могу преобразовать изображение в байты [] C # - PullRequest
4 голосов
/ 29 января 2010

Я очень новичок в этом деле сохранения изображений в БД, и даже когда я думал, что это очень просто, это не так. То, что я пытаюсь сделать, это прочитать и файл изображения с того же компьютера в любом формате, отобразить его в графическом окне, а затем преобразовать изображение в байты, чтобы сохранить его в БД. До сих пор я могу отображать изображение в графическом окне, но не могу преобразовать изображение в байты. Вот мой код:

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

Есть идеи о том, что происходит?

Ответы [ 5 ]

3 голосов
/ 29 января 2010

Вы должны использовать свойство RawFormat исходного изображения в качестве параметра метода Save, а не по умолчанию для Bitmap. Это позволит избежать ошибок типа формата изображения. например:

    image.Save(ms, image.RawFormat);

    ms.Position = 0;

    byte [] bytes=ms.ToArray();

Я бы посоветовал на самом деле сохранить изображения в файловую систему и просто сохранить путь к файлу (желательно относительный) в базе данных.

BLOB (т.е. изображения и т. Д.) В базе данных не могут быть проиндексированы, часто хранятся во вторичной области базы данных с более медленным доступом и быстро уменьшают размер базы данных (медленные резервные копии и т. Д.).

2 голосов
/ 29 января 2010

Не можете просто прочитать файл и загрузить его в байт [], используя класс File:

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

Вы можете выбрать путь к изображению в диалоговом окне «Открыть».

1 голос
/ 29 января 2010

Может быть глупо отвечать на мой собственный вопрос, но я только что обнаружил, что если я хочу преобразовать объект Image в байты, я должен оставить исходный поток открытым Я увидел эту проблему на другой странице, которую я не совсем помню, и я протестировал ее, оставив поток открытым, и это правда. Таким образом, формат не был проблемой. Но я приму совет всех вас и сохраню изображения в отдельном каталоге. Спасибо за вашу помощь, ребята!

1 голос
/ 29 января 2010

Это конкретное исключение обычно означает, что вы пытаетесь сохранить изображение в неправильном формате. В вашем коде вы указываете ImageFormat.Bmp - действительно ли это растровое изображение, или вы, возможно, загрузили его из JPEG или PNG? Попытка сохранить файл в формате, отличном от загруженного, завершится неудачей с ExternalException, как указано в документации .

Кстати, я не рекомендую хранить изображения в базе данных, и я верю, что большинство людей здесь согласятся. Базы данных могут быть в состоянии справиться с этой задачей, но они не оптимизированы для нее, и вы в конечном итоге снижаете производительность как вашей базы данных, так и вашего приложения. Если вы не используете столбцы SQL Server 2008 FILESTREAM, более эффективно хранить изображения в файловой системе.

0 голосов
/ 12 мая 2014

Проблема в том, что поток должен быть открыт во время жизни изображения, иначе произойдет сбой.

Одно из решений, которое сработало для меня, - просто создать копию изображения следующим образом:

using (var ms = new MemoryStream(bytes))
{
    _image = new Bitmap(Image.FromStream(ms));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...