2

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

4

2 回答 2

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

更新

关于如何克服这个问题的几种方法:

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

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

自定义绘图: 如何指定 WPF 图像使用的图像缩放算法?

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

更新 2

WriteableBitmapEx 可能会为您轻松完成这项工作:http ://writeablebitmapex.codeplex.com/

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

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

于 2013-04-05T01:32:03.463 回答
1
 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

于 2014-08-29T14:18:49.190 回答