0

私はいくつかの画像処理に取り組んでおり、デバッグのために元のビットマップに色をオーバーレイしています。

問題は、SizeModeがZoomに設定された画像ボックスに画像がレンダリングされ、ピクセルを更新するたびに無効化することです。ピクセルが非常に遅く、大きな画像ボックスが遅くなるだけです(同じサイズの画像の場合)

変更したピクセルのみを無効にしたが、変更したピクセルの座標をコントロール上にレンダリングされた長方形に変換する方法がわからない場合に役立つと思います。明らかに、画像が元の画像よりも大きく描画されている場合、無効にしている長方形は複数のピクセルになります

4

3 に答える 3

1

すべてのピクセルを変更してから、画像を1回だけ無効にすることはできますか?

于 2011-05-13T21:53:50.360 に答える
1

画像poxのズームとパディングを取得するメソッドを追加しました

    private void CalculateZoomAndPadding()
    {
        Double imageAspect = (Double)pictureBox1.Image.Width / (Double)pictureBox1.Image.Height;
        Double pbAspect = (Double)pictureBox1.Width / (Double)pictureBox1.Height;
        Boolean heightRestricted = imageAspect < pbAspect;
        hPadding = 0;
        vPadding = 0;
        if (heightRestricted)
        {
            zoom = (Double)pictureBox1.Height / (Double)pictureBox1.Image.Height;
            Double imageWidth = (Double)pictureBox1.Image.Width * zoom;
            hPadding = (Double)(pictureBox1.Width - imageWidth) / 2d;
        }
        else
        {
            zoom = (Double)pictureBox1.Width / (Double)pictureBox1.Image.Width;
            Double imageHeight = (Double)pictureBox1.Image.Height * zoom;
            vPadding = (Double)(pictureBox1.Height - imageHeight) / 2d;
        }
    }

次に、invalidateというピクセルを次のように無効にします。

pictureBox1.Invalidate(new Rectangle(Convert.ToInt32(Math.Floor(x * zoom)) + Convert.ToInt32(hPadding) -1, Convert.ToInt32(Math.Floor(y * zoom)) + Convert.ToInt32(vPadding) -1, PixelSize, PixelSize));

私が最初にこれを行ったとき、私はピクセルによって直接カバーされているものを無効にするだけでしたが、これは丸め誤差の影響を受けることがわかったので、いくつかの余分なものを含めるように拡張しました。

于 2011-06-13T12:11:18.400 に答える
0

コントロール全体を無効にする、1秒間に30回または60回起動するタイマーを追加するだけです。更新にわずかな遅延があるかもしれませんが、モニターのリフレッシュレートはとにかく60 Hzである可能性が高いため、気付かないはずです。

于 2011-05-13T21:57:20.113 に答える