用C#覆盖图像图片框

时间:2016-06-09 21:54:50

标签: c#

我正在做一个申请, 我添加了一个图片框来添加图像到一些产品,我有一个问题,我想编辑已经添加到一个产品的图像,我该怎么办? 这是我的实际代码。

private void pbImagenEquipo_DoubleClick(object sender, EventArgs e)
{
    ofdImagenes.Filter = "Imagenes JPG (*.jpg)|*.jpg; *.jpeg;|Imagenes PNG (*.png)|*.png";
    DialogResult resp = ofdImagenes.ShowDialog();
    if (resp == DialogResult.OK)
    {
        Bitmap b = new Bitmap(ofdImagenes.FileName);
        string [] archivo = ofdImagenes.FileName.Split('.');
        nombre = "Equipo_" + lbID+ "." + archivo[archivo.Length-1];

        b.Save(Path.Combine(Application.StartupPath, "Imagenes", nombre));

        pbImagenEquipo.Image = b;

    }
}

但是当我尝试更换图像时,我收到了这个错误:

An unhandled exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll

Additional information: Error generoc in e GDI+.

1 个答案:

答案 0 :(得分:1)

这是一个常见问题。

documentation说:

  

将图像保存到其构造的同一文件中则不是   允许并抛出异常。

有两种选择。一种是在写入之前删除文件。

另一种是使用Stream来编写它。我更喜欢后者......:

string fn = "d:\\xyz.jpg";

// read image file
Image oldImg = Image.FromFile(fn);

// do something (optional ;-)
((Bitmap)oldImg).SetResolution(123, 234);

// save to a memorystream
MemoryStream ms = new MemoryStream();
oldImg.Save(ms, ImageFormat.Jpeg);

// dispose old image
oldImg.Dispose();

// save new image to same filename
Image newImage = Image.FromStream(ms);
newImage.Save(fn);

请注意,如果您控制编码选项,保存jpeg文件通常可以获得更好的质量。使用this overload进行此操作..

另请注意,由于我们需要处理图像,因此您需要确保它不会在任何地方使用,例如在PictureBox.Image中!如果是,请在处置之前将其设置为nullpictureBox1.Image = null;

有关删除旧文件的解决方案,请参阅here