0

我想在滚动 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保持新的,我可以在图像上看到一个清晰的字符串。提前致谢。

4

1 回答 1

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));
}

这会将放大的图像绘制到图片框上,然后在其顶部绘制文本。这意味着图像已缩放,但文本仍保持您指定的任何字体大小。

于 2012-11-05T17:02:16.147 回答