0

私はお互いに2つの画像コントロールを持っており、いくつかのピクセルのアルファチャンネルを上からゼロに設定しています(これはカラフルです)。しかし、「ズーム」(ScaleTransform の幅) すると、設定したピクセルの周囲に「境界線」が表示されます。スクリーンショットは次のとおりです。

ここに画像の説明を入力

コードは次のとおりです。

        <Grid Name="grdPhotos">
            <Image Stretch="None" Source="picture_grayscale.jpg" Name="photo1" HorizontalAlignment="Left" VerticalAlignment="Top" />
            <Image Stretch="None" Source="picture.jpg" Name="photo2" MouseLeftButtonDown="photo2_MouseLeftButtonDown" HorizontalAlignment="Left" VerticalAlignment="Top" />
        </Grid>

    private void photo2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var photo = photo2.Source as WriteableBitmap; // A WriteableBitmap is created before from the Source BitmapImage
        for (int x = 100; x < 200; x++)
        {
            for (int y = 100; y < 200; y++)
            {
                int index = Convert.ToInt32(photo.PixelWidth * y + x);
                if (index > 0 && index < photo.Pixels.Length)
                    SetPixelAlphaChannel(ref photo.Pixels[index], 0);
            }
        }

        var transform = new ScaleTransform { ScaleX = 2, ScaleY = 2 };
        photo1.RenderTransform = photo2.RenderTransform = transform;
    }

    public void SetPixelAlphaChannel(ref int pixel, byte value)
    {
        var color = ColorFromPixel(pixel);
        if (color.A == value)
            return;

        color.A = value;
        pixel = ColorToPixel(color);
    }

    private Color ColorFromPixel(int pixel)
    {
        var argbBytes = BitConverter.GetBytes(pixel);
        return new Color { A = argbBytes[3], R = argbBytes[2], G = argbBytes[1], B = argbBytes[0] };
    }
    private int ColorToPixel(Color color)
    {
        var argbBytes = new byte[] { color.B, color.G, color.R, color.A };
        return BitConverter.ToInt32(argbBytes, 0);
    }

どうしてこれなの?または、この「境界線」なしでズーム機能を実装するにはどうすればよいですか? どうもありがとう。

4

1 に答える 1

0

画像をズームすると、ピクセル値が補間されます。これにより、境界線のピクセルが発生し、透明なピクセルを非透明な隣接ピクセルで補間した結果であることがわかります。残念ながら、レンダリング変換の補間動作を制御することはできません。おそらく を介して、これを自分で行う必要がありますWriteableBitmap

于 2012-08-18T06:35:03.177 に答える