Наложение меньшего изображения на большее с помощью WriteableBitmapEx Windows Phone

В моей игре со скрытыми объектами я хочу пометить объект изображением круга, когда он будет найден, с помощью следующего кода, где AnsX1, AnsX2, AnsY1, AnsY2 — это пиксельные координаты местоположения объекта. Изображение круга должно быть изменено в соответствии с размером объекта, отмеченным координатами в пикселях.

        imgCat.Source = writeableBmp;

        WriteableBitmap wbCircle = new WriteableBitmap(AnsX2 - AnsX1, AnsY2 - AnsY1);
        wbCircle = new WriteableBitmap(0, 0).FromContent("Images/circle.png");

        //Just to make sure the boundary is correct so I draw the green rec around the object
        writeableBmp.DrawRectangle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);

        Rect sourceRect = new Rect(0, 0, writeableBmp.PixelWidth, writeableBmp.PixelHeight);
        Rect destRect = new Rect(AnsX1, AnsY1, wbCircle.PixelWidth, wbCircle.PixelHeight);

        writeableBmp.Blit(destRect, wbCircle, sourceRect);
        writeableBmp.Invalidate();

Моя проблема заключается в том, что вместо одного большого круга у меня есть несколько меньших кругов, заполняющих область прямоугольника вверху (см. Изображение):

введите здесь описание изображения

EDIT 1: На основе ответа @Rene я изменил код на

        imgCat.Source = writeableBmp;

        //Just to make sure the boundary is correct so I draw the green rec around the object
        writeableBmp.DrawRectangle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);
        WriteableBitmap wbCircle = new WriteableBitmap(0, 0).FromContent("Images/circle.png");
        wbCircle = wbCircle.Resize(AnsX2 - AnsX1, AnsY2 - AnsY1, WriteableBitmapExtensions.Interpolation.Bilinear);

        Rect sourceRect = new Rect(0, 0, writeableBmp.PixelWidth, writeableBmp.PixelHeight);
        Rect destRect = new Rect(AnsX1, AnsY1, AnsX2 - AnsX1, AnsY2 - AnsY1);

        writeableBmp.Blit(destRect, wbCircle, sourceRect);
        writeableBmp.Invalidate();

Вот результат

введите здесь описание изображения

Я буду использовать файл Circle.png большего размера и лучшего качества, если мне удастся это исправить.


person PutraKg    schedule 03.02.2013    source источник


Ответы (1)


Во-первых, я думаю, что circle.png слишком мал. Метод Blit не масштабируется. Сначала вам нужно будет увеличить его, используя функцию Scale, например:

wbCircle = wbCircle.Resize(AnsX2 - AnsX1, AnsY2 - AnsY1, WriteableBitmapExtensions.Interpolation.Bilinear);

И, во-вторых, sourceRect использует размер всего растрового изображения/целевого изображения, а не размера wbCircle/исходного растрового изображения. Должно быть:

sourceRect = new Rect(0, 0, wbCircle.PixelWidth, wbCircle.PixelHeight);

Масштабирование может привести к некоторым артефактам масштабирования, если круг слишком мал, а масштабирование слишком велико. Если вам действительно нужен только простой цветной круг, вы также можете использовать вместо него метод DrawCircle:

writeableBmp.DrawCircle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);
person Rene Schulte    schedule 04.02.2013
comment
Спасибо за ответ. Круг становится больше после изменения размера, но он по-прежнему не заполняет весь прямоугольник. я отредактировал свой вопрос - person PutraKg; 05.02.2013
comment
Странный. Не могли бы вы загрузить пример проекта куда-нибудь. Это значительно ускорит этот процесс. Но почему вы просто не используете DrawCircle? - person Rene Schulte; 05.02.2013
comment
OK загрузит образец проекта. Я попробовал DrawCircle, но линии кругов кажутся немного неровными (я рисую пять кругов разного размера, чтобы получить более толстую кисть). В любом случае, я думаю, что использование изображения для обозначения местоположения будет выглядеть лучше, поскольку изображение, которое я собираюсь использовать, не является простым кругом. :) - person PutraKg; 05.02.2013
comment
OK. sourceRect использует размер всего / целевого растрового изображения, а не размера wbCircle / исходного растрового изображения. Я отредактировал свой ответ выше. - person Rene Schulte; 05.02.2013