0

いくつかの XAML ユーザー コントロールを PNG に変換するアプリを持っています。これは今まで非常にうまく機能していましたが、残念ながら画像のサイズを 2 倍にする必要があります。

私の方法 (それはうまくいきません!) は、視覚要素を読み込んだ後に ScaleTransform を視覚要素に追加することでした...

この行は、SaveUsingEncoder メソッドの先頭にある新しい行です。

visual.RenderTransform = GetScaleTransform(2);

PNG は新しいサイズ (3000 x 2000) ですが、XAML は画像の中央に 1500x1000 でレンダリングされます。

誰でも助けてもらえますか?

    private void Load(string filename)
    {
        var stream = new FileStream(filename), FileMode.Open);
        var frameworkElement = (FrameworkElement)(XamlReader.Load(stream));

        var scale = 2;

        var encoder = new PngBitmapEncoder();
        var availableSize = new Size(1500 * scale, 1000 * scale);

        frameworkElement.Measure(availableSize);
        frameworkElement.Arrange(new Rect(availableSize));
        name = name.Replace(" ", "-");
        SaveUsingEncoder(frameworkElement, string.Format(@"{0}.png", name), encoder, availableSize);
    }

    private TransformGroup GetScaleTransform(int scale)
    {
        var myScaleTransform = new ScaleTransform {ScaleY = scale, ScaleX = scale};
        var myTransformGroup = new TransformGroup();
        myTransformGroup.Children.Add(myScaleTransform);
        return myTransformGroup;
    }

    private void SaveUsingEncoder(FrameworkElement visual, string fileName, BitmapEncoder encoder, Size size)
    {
        visual.RenderTransform = GetScaleTransform(2);
        var bitmap = new RenderTargetBitmap(
            (int) size.Width,
            (int) size.Height,
            96,
            96,
            PixelFormats.Pbgra32);
        bitmap.Render(visual);

        var frame = BitmapFrame.Create(bitmap);
        encoder.Frames.Add(frame);

        using (var stream = File.Create(fileName))
        {
            encoder.Save(stream);
        }
    }
4

1 に答える 1

0

RenderTargetBitmap にレンダリングする前に、visual.UpdateLayout を呼び出します。

(この回答をくれたクレメンスに感謝します-しかし、彼はそれをコメントとして入れました!)

于 2012-04-27T12:33:43.343 に答える