我使用DrawString()
内的OnPaint()
在PictureBox上绘制一个字符串。它看起来像这样:
现在,当我从Graphics
获得的Graphics.FromImage()
对象上绘制完全相同的字符串时,字符串更小且不可读。我绘制的图像是5184 x 3456
,字体声明如下:
new Font("Arial", 16.0f, FontStyle.Regular, GraphicsUnit.World);
我尝试了所有GraphicsUnit
,但它完全没有区别。如何独立于图像分辨率绘制字体?
修改
在这种情况下,我没有看到“绘制代码”是如何相关的,但是在这里你去了:
void DrawOverlay(Graphics g, Font fnt, int containerWidth, int containerHeight)
{
if (!OverlayCheck.Checked)
return;
float padding = 5.0f;
float offset = 5.0f;
StringBuilder sb = new StringBuilder();
sb.AppendFormat("{0}\n", ISOComboBox.Text);
sb.AppendFormat("Exp. Time: {0}\n", TVComboBox.Text);
sb.AppendFormat("Aperture: {0}\n", AVComboBox.Text);
using (var tb = new SolidBrush(Color.FromArgb(150, 0,0,0)))
{
string infoStr = sb.ToString();
SizeF infoStrSize = g.MeasureString(infoStr, fnt);
var infoStrDim = new SizeF(infoStrSize.Width + padding * 2, infoStrSize.Height + padding * 2);
g.FillRectangle(tb, offset, containerHeight - offset - infoStrDim.Height, infoStrDim.Width, infoStrDim.Height);
g.DrawString(infoStr, fnt, Brushes.White, offset + padding, containerHeight - infoStrDim.Height);
if (TitleTextBox.Text.Length > 0)
{
var titleStr = SpliceText(TitleTextBox.Text, 15);
SizeF titleStrSize = g.MeasureString(titleStr, fnt);
var titleStrDim = new SizeF(titleStrSize.Width + padding * 2, titleStrSize.Height + padding * 2);
g.FillRectangle(tb, offset, offset, titleStrDim.Width, titleStrDim.Height);
g.DrawString(titleStr, fnt, Brushes.White, offset + padding, offset + padding);
}
}
}
一些背景:PictureBox上绘制的图像是来自相机的低分辨率实时流。在OnPaint()内部调用DrawOverlay()
来渲染文本覆盖。
当相机拍摄照片时,它具有更高的分辨率(5184 x 3456)。我从该图像(Graphics.FromImage()
)创建了一个图形上下文
再次DrawOverlay()
。这次文本更小,这是因为更高的分辨率。我希望两个图像中的文本大小相同。
实时取景有96/96 dpi(DpiX,DpiY),而高分辨率图像有72/72。所以我需要相对于dpi缩放字体。