2

私の隠しオブジェクト ゲームでは、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();

私の問題は、1 つの大きな円ではなく、上部の長方形領域を埋めるいくつかの小さな円があることです (画像を参照)。

ここに画像の説明を入力

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 を使用します。

4

1 に答える 1

3

まず、circle.png が小さすぎると思います。Blit メソッドはスケールアップしません。次のように Scale 関数を使用して、最初にスケールアップする必要があります。

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

そして 2 番目に、sourceRect は wbCircle / ソース ビットマップのサイズではなく、全体 / デスティネーション ビットマップのサイズを使用します。次のようにする必要があります。

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

円が小さすぎてアップ スケーリングが高すぎる場合、スケーリングによって何らかのスケーリング アーティファクトが発生する可能性があります。本当に単純な色付きの円だけが必要な場合は、代わりに DrawCircle メソッドを使用することもできます。

writeableBmp.DrawCircle(AnsX1, AnsY1, AnsX2, AnsY2, Colors.Green);
于 2013-02-04T08:35:24.267 に答える