Как обновить определенную часть растрового изображения?

Я вернулся, и за последние несколько недель я добился плавного прогресса, но это поставило меня в тупик в течение последних трех дней или около того, без каких-либо прорывов.

Этот код для справки.

    private void paintMap(int xToUpdate, int yToUpdate, int layerToUpdate)
    {
        // this should ONLY be called if mapBitmap has already been drawn initially
        Graphics gfx;

        // create a blank tile to place on top of whatever tile they want to place (to sucessfully update our tile)
        Bitmap blankTile = new Bitmap(Program.pixelSize, Program.pixelSize);
        gfx = Graphics.FromImage(blankTile);
        gfx.Clear(Color.Transparent);

        gfx = Graphics.FromImage(mapBitmap[layerToUpdate]);

        // only draw a map, if a map has been loaded
        if (mapLoaded)
        {
            #region Draw Map Loop
            // draw the map

            // find the tile at that point
            int tile = map.mapTile[xToUpdate][yToUpdate].getTileLayer(layerToUpdate);
            int x1 = Program.getTileXLocation(tile);
            int y1 = Program.getTileYLocation(tile);

            // set the tile's rectangle location 
            srcRect = new Rectangle(x1 * Program.pixelSize, y1 * Program.pixelSize, Program.pixelSize, Program.pixelSize);

            // draw the tile
            gfx.DrawImage(blankTile, xToUpdate * Program.pixelSize, yToUpdate * Program.pixelSize);
            gfx.DrawImage(gfxTiles, xToUpdate * Program.pixelSize, yToUpdate * Program.pixelSize, srcRect, units);

            // weather crap
            // screenMain.DrawImage(gfxNight, x1 * Program.pixelSize, y1 * Program.pixelSize, night, units);
            #endregion
        }
        else // otherwise, a map hasn't been loaded; clear the drawing surface
        {
            gfx.Clear(Color.Black);
        }

        gfx.Dispose();
    }

Это один из трех методов с одинаковым названием. У меня есть метод, который не принимает никаких параметров и обновляет всю карту (слои и все остальное), и этот код работает.

Но когда пользователь обновляет карту (путем размещения/удаления плитки), я не хочу перекрашивать всю карту. вместо этого я хочу просто обновить это конкретное пространство внесенными изменениями. Вместо обновления каждого слоя (путем переключения плитки, нарисованной там) и т. д. и т. д., весь метод заключался в размещении новых плиток поверх старых. Я добавил растровое изображение BlankTile, думая, что его рисование перед внесением изменений решит проблему, но это не так.

Мой вопрос таков: есть ли способ просто обновить эту конкретную плитку на растровом изображении, удалив то, что там есть, и заменив его новым изображением?

Я могу дать больше информации, если это необходимо. Я хотел бы продолжать использовать встроенные библиотеки GDI, но если единственный способ решить эту проблему — переключиться, я бы так и сделал. Но я почти уверен, что должен быть способ исправить эту конкретную проблему, не отключая мою графическую библиотеку. Пока это более чем подходит для нужд этого проекта (за исключением этой конкретной ошибки).


person Silver    schedule 30.12.2013    source источник
comment
Я копирую вставленный код, поэтому остатки этого кода не имеют смысла (комментируйте). Так что просто игнорируйте их. :п   -  person Silver    schedule 31.12.2013


Ответы (1)


Нашел быстрое и грязное решение, не уверен, что это лучшее решение.

// clear the tile to be redrawn
int x2 = xToUpdate * Program.pixelSize;
int y2 = yToUpdate * Program.pixelSize;

for (int a = x2; a <= x2 + Program.pixelSize - 1; a++)
{
    for (int b = y2; b <= y2 + Program.pixelSize - 1; b++)
    {
        mapBitmapFringe.SetPixel(a, b, Color.Transparent);
    }
 }

По сути, я установил прозрачность области растрового изображения, которую хочу обновить, с помощью SetPixel. После этого я могу свободно перерисовывать плитку на область, потому что то, что было раньше, было "очищено".

Извините за потраченное время. Думаю, если бы я потратил еще несколько часов на исследования, я бы нашел решение своей проблемы. (Я не знаю, почему я продолжал игнорировать метод SetPixel!) Я собираюсь переименовать свой вопрос, чтобы было легче понять, чего я пытался достичь. :)

person Silver    schedule 31.12.2013