Как решить эту проблему? - PullRequest
0 голосов
/ 25 февраля 2010

Я загружаю файл растрового изображения 50x50, а затем заполняю его одним случайным цветом при запуске программы. Затем сохраните результат в том же файле и назначьте его в PictureBox, но у вас возникли проблемы с записью файла, а также «Произошла общая ошибка в GDI +» и т. Д.

Как сделать это правильно, чтобы я мог постоянно повторять это (открыть растровое изображение, нарисовать его случайным цветом, сохранить и назначить для picturebox.Image)?

EDIT:

  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 ( );
  }

Ответы [ 3 ]

3 голосов
/ 26 февраля 2010

Простая адаптация с правильными using с будет выглядеть так:

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;   
}
2 голосов
/ 25 февраля 2010

Когда вы используете конструктор 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;
}
1 голос
/ 25 февраля 2010

О. Вам нужен отдельный файл для каждого из ваших изображений, в противном случае вы перезаписываете первое на второе. Дело в том, что изображение может быть прочитано только позже, когда оно действительно необходимо.

Другой вариант - хранить изображения в потоках памяти, а не в файлах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...