TransformedBitmap缩放模式

时间:2013-04-04 20:45:13

标签: c# wpf image scaling

我正在使用TransformedBitmap类使用Bitmap将缩放后的图片绘制到TransformedBitmap.CopyPixels。有没有办法指定使用的缩放模式? RenderOptions.SetBitmapScalingMode似乎没有任何影响。我想使用最近邻居,但似乎使用了某种双线性滤波器。

2 个答案:

答案 0 :(得分:3)

  • 无法指定缩放算法,它是设计使然。
  • RenderOptions.SetBitmapScalingMode仅适用于渲染,例如你有一个32 * 32的图标,并希望以256 * 256显示它,但仍然是一个块状的方式(最近的邻居)

<强>更新

有关如何克服此问题的一些方法:

自己动手: http://tech-algorithm.com/articles/nearest-neighbor-image-scaling/

使用表格: https://stackoverflow.com/a/1856362/361899

自定义绘图: How to specify the image scaling algorithm used by a WPF Image?

也有AForge,但这可能对你的需求有点过分。

更新2

WriteableBitmapEx可能很容易为您完成工作:http://writeablebitmapex.codeplex.com/

您可以调整WriteableBitmap的大小,指定插值模式,并且有最近邻居。

TransformedBitmap和WriteableBitmapEx都继承自BitmapSource,您可能根本无法对现有代码进行任何更改。

答案 1 :(得分:0)

 public static class Extensions
{
    public static BitmapFrame Resize(this
BitmapSource photo, int width, int height,
BitmapScalingMode scalingMode)
    {

        var group = new DrawingGroup();
        RenderOptions.SetBitmapScalingMode(
            group, scalingMode);
        group.Children.Add(
            new ImageDrawing(photo,
                new Rect(0, 0, width, height)));
        var targetVisual = new DrawingVisual();
        var targetContext = targetVisual.RenderOpen();
        targetContext.DrawDrawing(group);
        var target = new RenderTargetBitmap(
            width, height, 96, 96, PixelFormats.Default);
        targetContext.Close();
        target.Render(targetVisual);
        var targetFrame = BitmapFrame.Create(target);
        return targetFrame;
    }
}

http://weblogs.asp.net/bleroy/resizing-images-from-the-server-using-wpf-wic-instead-of-gdi

开始