2015-10-28 2 views
1

Ниже приведен мой код для изменения моей информации о панели в растровое изображение. Bitmap сначала генерируется моей информацией о панели, а затем сохраняется как файл изображения. Я подтвердил, что ширина, высота и границы представляют собой правильную информацию, предоставленную моей панелью. В настоящее время я не уверен, почему мой результат bmp/​​jpeg-файл отличается от изображения на моей панели.C# Сохранение изображения панели дает разные результаты

// сохранение растрового функция

 Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height); 
     Debug.WriteLine("bounds: " + panel1.ClientRectangle); 
     this.panel1.DrawToBitmap(bmp, panel1.ClientRectangle); 
     bmp.Save(@"C:\Documents and Settings\Flaw\Desktop\Test.bmp", ImageFormat.Bmp); 

// функции рисование

 System.Drawing.Graphics graphicsObj; 

     graphicsObj = this.panel1.CreateGraphics(); 

     Pen myPen = new Pen(System.Drawing.Color.Black, 5); 
     graphicsObj.Clear(Color.White); 
     //graphicsObj.DrawLine(myPen, 50, 50, 100, 100); 
     if (bCircle) 
     { 
      graphicsObj.DrawEllipse(myPen, x, y, 100, 100); 
     } 
     else if (bSquare) 
     { 
      graphicsObj.DrawRectangle(myPen, x, y, 100, 100); 
     } 

Результата я получаю при сохранении растрового изображения.

enter image description here

Образ, который находится на моем панели1 (обрезанные из моего окна Form)

enter image description here

ответ

2

Ваше свойство Bounds это отношения панель имеет родительского контейнера, так что выигранный» т всегда работает:

this.panel1.DrawToBitmap(bmp, panel1.Bounds); 

Попробуйте вместо этого:

this.panel1.DrawToBitmap(bmp, panel1.ClientRectangle); 

Ваш размер растрового изображения следует также использовать свойства ClientSize, так как ширина и высота панели включают в себя любые пограничные размеры:

Bitmap bmp = new Bitmap(panel1.ClientSize.Width, panel1.ClientSize.Height); 

Per вашего обновления, CreateGraphics временный холст и не будет часть панели, поэтому спасти было нечего. вместо того, чтобы использовать событие рисования на панели в:

private void panel1_Paint(object sender, PaintEventArgs e) { 
    using (Pen myPen = new Pen(Color.Black, 5)) { 
    e.Graphics.Clear(Color.White); 
    if (bCircle) { 
     e.Graphics.DrawEllipse(myPen, x, y, 100, 100); 
    } else if (bSquare) { 
     e.Graphics.DrawRectangle(myPen, x, y, 100, 100); 
    } 
    } 
} 

Чтобы сделать обновление, вам просто нужно аннулировать контроль:

panel1.Invalidate(); 
+0

Я обновил код, как: Bitmap BMP = новый Bitmap (panel1.ClientSize .Width, panel1.ClientSize.Height); Debug.WriteLine ("bounds:" + panel1.ClientRectangle); this.panel1.DrawToBitmap (bmp, panel1.ClientRectangle); bmp.Save (@ "C: \ Documents and Settings \ Flaw \ Desktop \ Test.bmp", ImageFormat.Bmp); Но теперь результат представляет собой сплошной серый цвет, такой же, как цвет окон. – user3235731

+0

@ user3235731 Я не знаю, что в вашей панели. Вам нужно документировать это. – LarsTech

+0

Извините, я получу редактирование в главном сообщении – user3235731

Смежные вопросы