1

このスレッドはほとんど私が必要としているものです: 半透明のビットマップからGraphicsPathを作成する

しかし、彼は画像の周りに輪郭を描いています-私は画像の中にほんの数ピクセルを描く必要があります。基本的に、「Focus Rectangle」を描画しようとしています(長方形ではない場合を除く)。現在のコードにぴったり収まるように、結果はGraphicsPathの形式である必要があります。

プライベート関数GetImagePath(img as Image)asGraphicsPath...終了関数

[編集] わかりました、まず第一に、他の投稿からコードを機能させることさえできません。私はこの行でインデックスを範囲外にし続けます:

* byte alpha = originalBytes [y *bitmapData.Stride + 4 * x + 3]; *

それはそれが最初に他のものをすり抜ける場合です。多くの場合、画像の大部分が不透明である場合、不透明なポイントが見つからなかった最初のループから発生します。

最新の問題は、意味をなさないポイントのリストが作成されることです。画像は68x68です私のポイントのリストには290x21のようなポイントがあり、2316x-15のようなもっとクレイジーなポイントもあります

これは私の元の画像です:

[原因imnewをアップロードさせません]

70x70のボタンの背景画像-それが重要な場合。

4

1 に答える 1

1

リンクで提供されているルーチンを使用して、そこから出力を取得し、その周りに独自のラッパーを追加して、パスを変更し、必要な数ピクセルでそれをプッシュすると思います。入力パラメータで移動するピクセルの量を作成して、それを試してみることができます。

それ以外の場合は、提供されたルーチンに2番目のパスを直接追加できます。いずれにせよ、これは2パスのアプローチだと思います。オブジェクトの外側の境界を見つける必要があります。それが提供されているものです。次に、基本的に自分でパスを移動し、パスの導関数を理解して、現在のポイントで導関数に対して垂直にパスを移動できるようにする必要があります。また、外側から内側を認識する必要があります(つまり、線を移動する方向)。

アルゴリズムは次のようになります(アルゴリズムだけを思い出してください)。

Create New List of Points for the new line

For all points i in 0 to (n-2) (points in original point list)
    // Get a New point in between
    float xNew = (x(i) + x(i + 1) ) / 2
    float yNew = (y(i) + y(i + 1) ) / 2

    // Need to figure out how much to move in X and in Y for each (pixel) move along
    // the perpendicular slope line, remember a^2 + b^2 = c^2, we have a and b
    float a = y(i + 1) - y(i)
    float b = x(i + 1) - x(i)
    float c = sqrt( (a * a) + (b * b) )

    // c being the hypotenus is always larger than a and b.
    // Lets Unitize the a and b elements
    a = a / c
    b = b / c

    // Assume the original point array is given in clockwise fashion
    a = -a
    b = -b

    // Even though a was calculated for diff of y, and b was calculated for diff of x
    // the new x is calculated using a and new y with b as this is what gives us the
    // perpendicular slope versus the slope of the given line
    xNew = xNew + a * amountPixelsToMoveLine
    yNew = yNew + b * amountPixelsToMoveLine

    // Integerize the point
    int xListAdd = (int)xNew
    int yListAdd = (int)yNew

    // Add the new point to the list
    AddPointToNewPointList(xListAdd, yListAdd)

Delete the old point list

私が実行しているジオメトリの画像: 上でアルゴリズム的に説明しているジオメトリの画像

于 2012-05-30T17:04:25.053 に答える