transformmedbitmap缩放模式

本文关键字:模式 缩放 transformmedbitmap | 更新日期: 2023-09-27 18:07:23

我使用TransformedBitmap类使用TransformedBitmap.CopyPixels绘制缩放图像到Bitmap。是否有办法指定所使用的缩放模式?RenderOptions.SetBitmapScalingMode似乎对什么都没有影响。我想使用最近邻,但它似乎使用某种双线性过滤器。

transformmedbitmap缩放模式

  • 不可能指定缩放算法,它是由设计的。
  • 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的大小,指定插值模式,并有最近的邻居。

transformmedbitmap和WriteableBitmapEx都继承自BitmapSource,很可能你不需要对现有的代码做任何改变。

 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