2010-02-25 5 views
0

Я загружаю файл растрового изображения 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 (); 
    } 
+0

Пожалуйста, покажите нам свой код. – SLaks

+0

Извините, что добавил. –

+0

Является ли объект «Graphics» управляющим растровым изображением после вызова функции «Graphics.FromImage»? Если это так, возможно, вам нужно взаимодействовать с растровым изображением через объект «Graphics» или каким-то образом отсоединить его от графического объекта, прежде чем пытаться «Сохранить» или «Утилизировать»? –

ответ

3

Простая адаптация, с соответствующими 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; 
} 
+0

Спасибо Henk. Будет ли «использовать» ключевые слова так? Как их эффект в этом случае? Все они принадлежат к той же сфере? –

+0

Btw дает общую ошибку GDI. –

+1

@Joan, 'using' работает так же, как' if() ': 1 оператор или несколько операторов в фигурных скобках. Отступы здесь типичны, но это общепринятая практика. –

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; 
} 
+1

Вам также нужно установить «битмап», «графику» и «кисть». (Если вы не используете 'SolidBrushes.Black') – SLaks

+0

действительно ... просто исправил его;) –