0

トラックバーをスクロールした後に文字列を移動したい。問題は、以前の文字列が新しい文字列のままであることです。したがって、結果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 に答える