Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在现有图像上保存图像_C#_Image_Jpeg - Fatal编程技术网

C# 在现有图像上保存图像

C# 在现有图像上保存图像,c#,image,jpeg,C#,Image,Jpeg,我正在开发一个C#应用程序,其中我想做的第一件事是根据文件中的元数据旋转图像。这部分很好用。但是在现有图像之上保存图像是我遇到问题的地方。我删除原始文件,关闭流,并尝试将图像保存为原始图像的名称,但它不起作用。我得到以下例外情况: 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dllAdditional information: A generic error occurred in G

我正在开发一个C#应用程序,其中我想做的第一件事是根据文件中的元数据旋转图像。这部分很好用。但是在现有图像之上保存图像是我遇到问题的地方。我删除原始文件,关闭流,并尝试将图像保存为原始图像的名称,但它不起作用。我得到以下例外情况:

'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dllAdditional information: A generic error occurred in GDI+.
这是我正在使用的代码。这和我的工作版本有点不同,所以如果我遗漏了什么,请原谅我。在我的原始版本中,我只保存了

using (FileStream fs = new FileStream(item, FileMode.Open)) {
    im = Image.FromStream(fs);
    sourceFormat = im.RawFormat;

    // Get the image orientation from the image metadata 
    PropertyItem pi = im.GetPropertyItem(274);
    int orientation = pi.Value[0];

    switch (orientation) {
        // TODO: Set rotation and flips for all orientations
        // case 1 - 5 & 7 removed for clarity
        //    break;
        case 6:
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate90);
            edited = true;
            pi.Value[0] = 1;
            im.SetPropertyItem(pi);
            fs.Close();
            File.Delete(item);
            im.Save(item, GetEncoder(sourceFormat), encoderParameters);
            break;
        case 8:
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)EncoderValue.TransformRotate270);
            pi.Value[0] = 1;
            im.SetPropertyItem(pi);
            fs.Close();
            File.Delete(item);
            im.Save(item, GetEncoder(sourceFormat), encoderParameters);
            break;
        } 
    }

    im.Dispose();
    if (encoderParameters != null)
        encoderParameters.Dispose();
}

尝试将文件流设置为读写。另外,请尽量不要
Dispoose
。我相信这是你的主要问题。另外,在完成操作之前,不要关闭
fs
。我建议您在使用完后关闭
fs
和图像。也许在函数的末尾

我修改了您的代码以测试解决方案(仅用于验证,而不是修改您的实现)


如果使用不同的文件名保存图像是否有效?不在此配置中,但如果我在使用filestream后执行所有保存和删除操作,则有效。因此,我最初必须让它工作的是一个bool,如果图像被编辑,那么我们将在使用块之后进行保存和删除。在那个例子中,我不得不使用一个不同的名称-在文件名的末尾加上一个-1。这是否有助于在什么地方发生异常?是的,这就是诀窍。我开始研究评论中提到的解决方案,然后看到了这一点。工作起来很有魅力。
encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Transformation, (long)System.Drawing.Imaging.EncoderValue.TransformRotate90);
//edited = true;
pi.Value[0] = 1;
im.SetPropertyItem(pi);

// Added new memorystream
System.IO.MemoryStream ms = new MemoryStream();
// Read into memorystream
im.Save(ms, GetEncoder(sourceFormat), encoderParameters);
fs.Close();
File.Delete(item);

// Read from memorystream into byte array
byte[] ni = ms.ToArray();
// Save out using new filestream.
using (FileStream nfs = new FileStream(item, FileMode.Create, FileAccess.ReadWrite)){
    nfs.Write(ni, 0, ni.Length);
}
//im.Save(item, GetEncoder(sourceFormat), encoderParameters);