我希望有人可以解决我将已提供给我的图像保存为字节数组的问题。
版本:
故事是
当原始文件为PNG格式时,所有方法均有效。但是,如果为Jpg格式,则失败。
下面是一些示例代码,您可以在基本的控制台应用程序中使用这些代码,只要引用System,就可以运行它。
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
实例。但是,只有我拥有的是原始字节数组,因此我不知道我的图像格式是什么。
任何帮助将不胜感激,谢谢!
编辑: 我尝试从原始文件创建字节数组并将其保存回磁盘(请参见下面的代码)以及使用jpgs时,都将图像格式指定为JPG,但仍然无法通过jpgs进行操作。 Png仍然可以正常工作
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}");
}
答案 0 :(得分:1)
您要在写入图像之前处理MemoryStream
,请在保存文件后尝试处理流。对我有用:)
如果要获取图像格式,请尝试从流的前几个字节中检测出来: