我想在滚动Trackbar后移动一个字符串。问题是,前一个字符串与新字符串保持一致。因此,结果Image
会得到一个不可读的字符串。
Image img;
readonly Image _originalImg;
Graphics imgScale;
public Form(){
InitializeComponent();
_originalImg = Image.FromFile("d:\\a.jpg");
img = _originalImg;
imgScale = Graphics.FromImage(img);
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
img = null;
pictureBox1.Image = null;
imgScale = null;
img = _originalImg;
x = trackBar1.Value;
imgScale = Graphics.FromImage(img);
imgScale.DrawString(str, font, color, new PointF(x, 0));
pictureBox1.Image = img;
}
任何人都可以编辑我的代码,以便_originalImg
保持新的状态,我可以在图像上看到一个清晰的字符串。
提前谢谢。
答案 0 :(得分:1)
这应该适合你:
readonly Image _originalImg;
public Form(){
InitializeComponent();
_originalImg = Image.FromFile("d:\\a.jpg");
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
pictureBox1.Invalidate();
}
private void pictureBox1_paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(_originalImg, 0, 0);
e.Graphics.DrawString(str, font, color, new PointF( trackBar1.Value, 0));
}
我们在这里大致正在做的是将图像绘制到图片框上,并将文本绘制到图片框上。这意味着原始图像永远不会被修改。
我们也只会在事情发生变化时更新图像(或者表格被告知要通过窗口等重新绘制)。为确保图片更新,我们会在跟踪栏值更改时调用pictureBox1.Invalidate();
。
由于你不想用其他文本保存图像,我们可以大大简化:
public Form(){
InitializeComponent();
pictureBox1.Image = Image.FromFile("d:\\a.jpg");
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
pictureBox1.Invalidate();
}
private void pictureBox1_paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString(str, font, color, new PointF( trackBar1.Value, 0));
}
这将绘制缩放到图片框上的图像,然后在其顶部绘制文本。这意味着图像被缩放,但文本保持为您指定的任何字体大小。