我正在尝试使用GDI +保存文件,但我只是得到了“GDI +中发生了一般错误”异常。这段代码适用于几乎所有照片,但是这一张(我们每天处理数千张照片,这是我听过的第一张照片)。我认为它可能与exif数据有关,或者可能与摄影师相机或编辑器中的其他东西有关。
以下是使用此照片重现错误的代码:
class Program
{
static void Main(string[] args)
{
using (var img = Image.FromFile("Err.jpg"))
using (var ms = new MemoryStream())
{
img.Save(ms, ImageFormat.Jpeg);
}
}
}
我应该如何在GDI +中处理这个问题?有没有办法去除导致问题的额外内容?
答案 0 :(得分:0)
似乎首先将图像转换为bmp可以解决问题。很高兴找到一种更有效的方法(不需要创建多个图像并加载到内存中),但这是我迄今为止发现的最好的。
static void Main(string[] args)
{
var path = @"gdi_err.jpg";
using (var img1 = Image.FromFile(path))
using (var ms1 = new MemoryStream())
{
img1.Save(ms1, ImageFormat.Bmp);
ms1.Position = 0;
using (var img2 = Image.FromStream(ms1))
using (var ms2 = new MemoryStream())
{
img2.Save(ms2, ImageFormat.Jpeg);
}
}
}
答案 1 :(得分:0)
您图像的exif配置文件似乎是个问题。当我删除它时,我可以将图像保存到内存流。我使用Magick.NET删除了exif配置文件。
using (MagickImage magickImage = new MagickImage())
{
using (var magickStream = new MemoryStream())
{
magickImage.Read(@"gdi_err.jpg");
magickImage.Strip();
magickImage.Write(magickStream);
magickStream.Position = 0;
// This part is just here to demonstrate that saving the image works.
// You don't need it because magickStream already contains the data you want.
using (Image image = Image.FromStream(magickStream))
{
using (var ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Jpeg);
}
}
}
}