我正在尝试在 WPF 应用程序中的图像控件上绘制位图。图像定义为 800 x 800。
我所做的是,创建一个 DrawingVisual,使用 RenderOpen() 创建一个 DrawingContext,对 DrawingContext 应用更改(在本例中,绘制交替的红色和蓝色 98 x 98 矩形),然后创建一个大小为 800 x 80 的 RenderTargetBitmap还有一些手动输入的 DPI,对其调用 Render(),并将 Image 的源设置为位图。
问题是,除非我知道 DPI 是多少,否则图像不会呈现正确的尺寸。由于某些奇怪的原因,DPI 似乎在 91 左右。
这是创建图像的 C# 代码 - 请注意,目前我将 DPI 硬编码为 96:
DrawingVisual D = new DrawingVisual();
DrawingContext DC = D.RenderOpen();
DC.DrawRectangle(Brushes.White, null, new Rect(0, 0, 800, 800));
int R, C;
for (R = 0; R < 8; R++)
{
for (C = 0; C < 8; C++)
{
Brush TheColor = Brushes.Red;
if ((R + C) % 2 == 0)
{
TheColor = Brushes.Blue;
}
DC.DrawRectangle(TheColor, null, new Rect(C * 100 + 1, R * 100 + 1, 98, 98));
}
}
DC.Close();
double DPI_X = 96.0;
double DPI_Y = 96.0;
RenderTargetBitmap B = new RenderTargetBitmap(800, 800, DPI_X, DPI_Y, PixelFormats.Pbgra32);
B.Render(D);
theImage.Source = B;
这是图像控件的 XAML:
<Image x:Name="theImage" HorizontalAlignment="Left" Height="800" Width="800"
Margin="0,0,0,0" VerticalAlignment="Top" />
首先,我是否以正确的方式处理这件事?图像显示正确 - 只是尺寸不正确。
假设这是正确的方法,我如何确定屏幕 DPI?我在网上找到的方法要么返回 null 要么返回 96。
我的做法是否正确?
我会说不。您根本不需要位图。
继续使用矢量图形并创建 DrawingImage:
var drawingGroup = new DrawingGroup();
for (int r = 0; r < 8; r++)
{
for (int c = 0; c < 8; c++)
{
var fill = (r + c) % 2 == 0 ? Brushes.Blue : Brushes.Red;
var drawing = new GeometryDrawing(
fill,
null,
new RectangleGeometry(new Rect(c * 100 + 1, r * 100 + 1, 98, 98)));
drawingGroup.Children.Add(drawing);
}
}
var drawingImage = new DrawingImage(drawingGroup);
theImage.Source = drawingImage;