Я пытаюсь переписать старый код vb6 с помощью C-sharp. Проблема в том, что когда я использовал FloodFill в vb, он сохраняет изображение с эффектом FloodFill. Это неверно при использовании до-диез. Вот сегмент кода для VB6:
hTempBrush = CreateSolidBrush(&H400000)
'Select the brush into the dc.
hPrevBrush = SelectObject(Maparea.hdc, hTempBrush)
'Fill the area.
FloodFill Maparea.hdc, (100 ), (200), MapColor
SelectObject Maparea.hdc, hPrevBrush
DeleteObject hTempBrush
SavePicture Maparea.Picture, "filename.bmp" ' saves picture with flood fill affect
а вот С#
Graphics g2 = Graphics.FromHwnd(pictureBox1.handle);
IntPtr vDC = g2.GetHdc();
IntPtr vBrush = CreateSolidBrush(ColorTranslator.ToWin32(Color.Navy));
IntPtr vPreviouseBrush = SelectObject(vDC, vBrush);
int hh = ColorTranslator.ToWin32(Color.Wheat);
FloodFill(vDC, 100, 200, hh);
SelectObject(vDC, vPreviouseBrush);
DeleteObject(vBrush);
pictureBox1.Image.Save("map.bmp"); // saves without the affect of floodfill
g2.ReleaseHdc(vDC);
Любая помощь приветствуется.
У вас также есть возможность нарисовать изображение на поверхности элемента управления — в событии Paint элемента управления — используйте элемент управления hDC для функции ExtFloodFill (e.Graphics.GetHdc()), вызовите e.Graphics.Flush() перед [Control].DrawToBitmap(). Конечно, вам не нужно назначать Bitmap свойству Image.
Спасибо Джим за ответ. Я попробовал сбросить, затем DrawToBitmap() и получил тот же результат. Однако во время поиска DrawToBitmap я нашел ответ на свой вопрос — это BitBlt.
Control.DrawToBitmap() использует BitBlt. Но, как уже упоминалось, вы должны использовать объект Graphics, предоставляемый объектом PaintEventArgs события Paint: здесь учитывается ссылка hDC. Вы использовали неправильный.





Я нашел ответ. Я должен использовать BitBlt, поэтому все, что появляется на панели управления, сохраняется.
private void button4_Click(object sender, EventArgs e)
{
var bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (var bmpGraphics = Graphics.FromImage(bmp))
{
var despDC = bmpGraphics.GetHdc();
using (Graphics formGraphics = Graphics.FromHwnd(pictureBox1.Handle))
{
var srcDC = formGraphics.GetHdc();
BitBlt(despDC, 0, 0, pictureBox1.Width, pictureBox1.Height, srcDC, 0, 0, SRCCOPY);
formGraphics.ReleaseHdc(srcDC);
}
bmpGraphics.ReleaseHdc(despDC);
}
bmp.Save("map1.jpg");
Вы используете hDC элемента управления, затем попробуйте сохранить растровое изображение, назначенное его свойству изображения. У этих двоих нет ничего общего (кроме самого Контроля). Используйте hdC растрового изображения и заполните его. Кстати, вы должны использовать ExtFloodFill (это действительно нетерпимая функция - как и ее старая версия - и дает очень плохие результаты). Если вам все равно, вы должны попытаться сделать это вручную, используя яркость цвета, который определяет область или границу. Добавьте допуск, чтобы сохранить сглаженные области.