Я использую DrawingContext для рисования изображений. Затем я визуализирую результат в RenderTargetBitmap. Я также визуализирую Canvas в тот же RenderTargetBitmap. Несмотря на то, что границы пикселей на экране четкие, при сохранении они становятся размытыми и нечеткими.
На снимке экрана ниже вы можете увидеть проблему (с BitmapScalingMode = NearestNeighbor).
Вот он с BitmapScalingMode = HighQuality. Он более гладкий, но не четкий и чистый.
Вот соответствующий раздел моего кода. Вы можете видеть, что я пытался установить RenderOptions в нескольких местах, но, похоже, это не дало никакого эффекта.
DrawingVisual drawingVisual = new DrawingVisual();
RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32);
RenderOptions.SetBitmapScalingMode(drawingVisual, BitmapScalingMode.NearestNeighbor); // This forces the scaling to be on even-pixel boundaries
RenderOptions.SetBitmapScalingMode(drawCanvas, BitmapScalingMode.NearestNeighbor); // This forces the scaling to be on even-pixel boundaries
RenderOptions.SetBitmapScalingMode(result, BitmapScalingMode.NearestNeighbor); // This forces the scaling to be on even-pixel boundaries
using (DrawingContext context = drawingVisual.RenderOpen()) {
context.DrawRectangle(Brushes.Black, null, new Rect(new Point(), new Size(size.Width, size.Height)));
if (layers.Count >= 1 && layers[0].LayerImage != null && layers[0].LayerImage.Source != null && gridImage.Children[1].Visibility == System.Windows.Visibility.Visible)
context.DrawImage(layers[0].LayerImage.Source, new Rect(size)); // Draw first image.
context.Close();
}
result.Render(drawingVisual);
drawCanvas.Measure(drawCanvas.RenderSize);
drawCanvas.Arrange(new Rect(drawCanvas.RenderSize));
for (int i = 0; i < drawCanvas.Children.Count; i++) {
RenderOptions.SetBitmapScalingMode(drawCanvas.Children[i], BitmapScalingMode.NearestNeighbor); // This forces the scaling to be on even-pixel boundaries
}
result.Render(drawCanvas);
BitmapEncoder encoder = new PngBitmapEncoder();
if (result!= null) {
encoder.Frames.Add(BitmapFrame.Create((BitmapSource)result));
encoder.Save(fileStream);
}
BitmapScalingMode
наHighQuality
- person 123 456 789 0   schedule 25.04.2014System.Drawing.Imaging.PixelFormat.Format32bppArgb
помогло мне сохранить четкие изображения. - person TaW   schedule 25.04.2014size
иdrawCanvas.RenderSize
при вызове 'result.Render(drawingVisual);'? - person Liero   schedule 06.02.2016