Я надеюсь, что кто-то может помочь с проблемой, у меня есть сохранение изображения, которое было дано мне в виде байтового массива.
Версия:
- .Net Framework 4.6.2
- C # 7,2
История
- Пользователь загружает изображение
- Мы сериализуем в байтовый массив и сохраняем это
- Позже мы получим этот байтовый массив и создадим поток памяти и с этим потоком создадим растровый объект.
- использовать этот растровый объект для сохранения на диск
Это все работает, когда исходный файл в формате 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}");
}