我正在加载一个50x50的Bitmap文件,然后在程序启动时填充一个随机颜色。然后将结果保存到同一文件并将其分配给PictureBox,但遇到文件写入问题和“GDI +中发生一般错误”等。
如何正确地执行此操作以便我可以不断重复此操作,(打开位图,将其绘制为随机颜色,保存并分配给picturebox.Image)?
编辑:
public Form1 ( )
{
InitializeComponent ( );
//Bitmap bmp = new Bitmap ( 50, 50 );
Bitmap bmp = new Bitmap ( @"C:\temp\pretty.bmp" );
Graphics g = Graphics.FromImage ( bmp );
Brush b = new SolidBrush ( Color.Red );
g.FillRectangle ( b, 0, 0, 49, 49 );
bmp.Save ( @"C:\temp\pretty.bmp" );
this.pictureBox1.Image = ( Image ) bmp.Clone ( );
//bmp.Dispose ( );
}
答案 0 :(得分:3)
使用正确的using
s进行简单的调整,如下所示:
private void Form1_Load(object sender, EventArgs e)
{
Bitmap bmp2;
using (Bitmap bmp1 = new Bitmap(@"C:\temp\pretty.bmp"))
{
//Edit: Clone was keeping a link between bmp1 and bmp2 somehow
// bmp2 = (Bitmap)bmp1.Clone();
IntPtr hbmp = bmp1.GetHbitmap();
bmp2 = Bitmap.FromHbitmap(hbmp);
}
using (Graphics g = Graphics.FromImage(bmp2))
using (Brush b = new SolidBrush(Color.Red))
{
g.FillRectangle(b, 0, 0, 49, 49);
bmp2.Save(@"C:\temp\pretty.bmp");
}
this.pictureBox1.Image = bmp2;
}
答案 1 :(得分:2)
当您使用带有路径参数的Bitmap
构造函数时,它会保持文件处于打开状态,直到您释放Bitmap
为止。您需要从Stream
加载位图,然后关闭Stream
以关闭文件。这应该可以正常工作:
public Form1 ( )
{
InitializeComponent ( );
Bitmap bmp = null;
using (Stream stream = File.OpenRead(@"C:\temp\pretty.bmp"))
{
bmp = new Bitmap(stream);
}
using (Graphics g = Graphics.FromImage ( bmp ))
using (Brush b = new SolidBrush ( Color.Red ))
{
g.FillRectangle ( b, 0, 0, 49, 49 );
}
bmp.Save ( @"C:\temp\pretty.bmp" );
this.pictureBox1.Image = bmp;
}
答案 2 :(得分:1)
喔。您需要为每个图像使用不同的文件,否则您将覆盖第一个图像。事情是,只有在实际需要时才可以读取图像。
另一种选择是将图像存储在内存流中,而不是存储在文件中。