FloodFill с использованием c-sharp

Я пытаюсь переписать старый код 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);

Любая помощь приветствуется.

Вы используете hDC элемента управления, затем попробуйте сохранить растровое изображение, назначенное его свойству изображения. У этих двоих нет ничего общего (кроме самого Контроля). Используйте hdC растрового изображения и заполните его. Кстати, вы должны использовать ExtFloodFill (это действительно нетерпимая функция - как и ее старая версия - и дает очень плохие результаты). Если вам все равно, вы должны попытаться сделать это вручную, используя яркость цвета, который определяет область или границу. Добавьте допуск, чтобы сохранить сглаженные области.

Jimi 26.12.2020 01:20

У вас также есть возможность нарисовать изображение на поверхности элемента управления — в событии Paint элемента управления — используйте элемент управления hDC для функции ExtFloodFill (e.Graphics.GetHdc()), вызовите e.Graphics.Flush() перед [Control].DrawToBitmap(). Конечно, вам не нужно назначать Bitmap свойству Image.

Jimi 26.12.2020 02:02

Спасибо Джим за ответ. Я попробовал сбросить, затем DrawToBitmap() и получил тот же результат. Однако во время поиска DrawToBitmap я нашел ответ на свой вопрос — это BitBlt.

Mohsen 26.12.2020 05:51
Control.DrawToBitmap() использует BitBlt. Но, как уже упоминалось, вы должны использовать объект Graphics, предоставляемый объектом PaintEventArgs события Paint: здесь учитывается ссылка hDC. Вы использовали неправильный.
Jimi 26.12.2020 05:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
337
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел ответ. Я должен использовать 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");

Другие вопросы по теме