Создайте растровое изображение из сохраненного байтового массива и сохраните на диск исключение GDI +, если источником байтового массива был jpg - PullRequest
0 голосов
/ 21 мая 2019

Я надеюсь, что кто-то может помочь с проблемой, у меня есть сохранение изображения, которое было дано мне в виде байтового массива.

Версия:

  • .Net Framework 4.6.2
  • C # 7,2

История

  1. Пользователь загружает изображение
  2. Мы сериализуем в байтовый массив и сохраняем это
  3. Позже мы получим этот байтовый массив и создадим поток памяти и с этим потоком создадим растровый объект.
  4. использовать этот растровый объект для сохранения на диск

Это все работает, когда исходный файл в формате PNG. Однако он не работает, когда он находится в формате Jpg.

Ниже приведен пример кода, который вы можете вставить в базовое консольное приложение и до тех пор, пока вы ссылаетесь на System.Drawing, он будет работать.

static void Main(string[] args)
{
    Console.WriteLine("Enter image file location");
    var filePath = Console.ReadLine();
    while (!File.Exists(filePath))
    {
        Console.WriteLine("Cannot find file. Try Again");
        filePath = Console.ReadLine();
    }

    byte[] bytes = File.ReadAllBytes(filePath);

    Bitmap image;
    using (var stream = new MemoryStream(bytes))
    {
        image = new Bitmap(stream);
    }

    WriteToFile(image);
    image.Dispose();
    Console.ReadKey();
}

private static void WriteToFile(Bitmap image)
{
    Console.WriteLine("Enter write location filename");
    var fileName = Console.ReadLine();
    image.Save(fileName);
    Console.WriteLine($"File saved to {fileName}");
}

Если исходное изображение в формате PNG, оно работает нормально, если это JPG, оно не работает. Это почему? Я вижу, что метод Save в растровом классе имеет перегрузку, которая принимает экземпляр ImageFormat. Однако только у меня есть оригинальный байтовый массив, поэтому я не знаю, какой у меня формат изображения.

Любая помощь будет очень признательна, спасибо!

EDIT: Я попытался указать формат изображения как JPG как при создании байтового массива из исходного файла, так и при сохранении его обратно на диск (см. Код ниже), а с помощью jpgs он по-прежнему не работает. Однако Pngs по-прежнему работают нормально

static void Main(string[] args)
{
    Console.WriteLine("Enter jpg file location");
    var filePath = Console.ReadLine();
    while (!File.Exists(filePath))
    {
        Console.WriteLine("Cannot find file. Try Again");
        filePath = Console.ReadLine();
    }

    byte[] bytes = CreateSerializedImage(filePath);

    Image image;
    using (var steram = new MemoryStream(bytes))
    {
        image = Image.FromStream(steram);
    }

    WriteToFile(image);
    image.Dispose();
    Console.ReadKey();
}

private static byte[] CreateSerializedImage(string filePath)
{
    var image = Image.FromFile(filePath);
    using (var stream = new MemoryStream())
    {
        image.Save(stream,ImageFormat.Jpeg);
        return stream.ToArray();
    }
}

private static void WriteToFile(Image image)
{
    Console.WriteLine("Enter write location filename");
    var fileName = Console.ReadLine();
    image.Save(fileName, ImageFormat.Jpeg);
    Console.WriteLine($"File saved to {fileName}");
}

1 Ответ

1 голос
/ 21 мая 2019

Вы удаляете MemoryStream перед записью изображения, попробуйте удалить поток после сохранения файла. Это сработало для меня:)

Если вы хотите получить формат изображения, попробуйте определить его по первым нескольким байтам потока:

Википедия: файл-подпись-список

...