Можно ли отключить антиалиасинг при использовании тайлинга ImageBru sh? - PullRequest
0 голосов
/ 27 мая 2020

Можно ли отключить сглаживание в WPF при использовании ImageBru sh?

Учитывая следующий код:

var handleImage = new BitmapImage(new Uri($"pack://application:,,,/Resources/myimage.png"));
var imageBrush = new ImageBrush(handleImage);
imageBrush.AlignmentY = AlignmentY.Top;
imageBrush.AlignmentX = AlignmentX.Left;
imageBrush.Stretch = Stretch.Uniform;
imageBrush.Viewport = new Rect(0, 0, _handleImage.Width, _handleImage.Height);
imageBrush.ViewportUnits = BrushMappingMode.Absolute;
imageBrush.TileMode = TileMode.Tile;
drawingContext.DrawRectangle(imageBrush, null, new Rect(0, 0, width, height));

Дает что-то вроде: WPF Output

Но я ожидаю: Expected Output

Сглаживание WPF по умолчанию делает его ужасным. Я пробовал UseLayoutRounding=true, SnapsToDevicePixels=true, RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.HighQuality), RenderOptions.SetBitmapScalingMode(this, BitmapScalingMode.NearestNeighbor) RenderOptions.SetEdgeMode(this, EdgeMode.Unspecified); в окне. Единственное, что меняет визуальные различия, - это BitmapScalingMode.NearestNeighbor, однако он по-прежнему выглядит странно, и мозаика перекрывает сама себя.

РЕДАКТИРОВАТЬ: Загрузить полный рабочий образец: WpfImageBrushExample.zip

1 Ответ

0 голосов
/ 29 мая 2020

Проблема заключалась в том, что BitmapImage ширина и высота были разными дробными числами - в данном случае это были 5.333 x 6x666 вместо ожидаемых 4 x 5 пикселей. Если я использую _handleImage.PixelWidth и _handleImage.PixelHeight, проблема решена, и я не получаю странных псевдонимов ни при одном из этих установленных параметров рендеринга.

var handleImage = new BitmapImage(new Uri($"pack://application:,,,/Resources/myimage.png"));
var imageBrush = new ImageBrush(handleImage);
imageBrush.AlignmentY = AlignmentY.Top;
imageBrush.AlignmentX = AlignmentX.Left;
imageBrush.Stretch = Stretch.Uniform;
imageBrush.Viewport = new Rect(0, 0, _handleImage.PixelWidth, _handleImage.PixelHeight);
imageBrush.ViewportUnits = BrushMappingMode.Absolute;
imageBrush.TileMode = TileMode.Tile;
drawingContext.DrawRectangle(imageBrush, null, new Rect(0, 0, width, height));

Производит: Expected

...