2013-12-02 3 views
3

Я рисую stringGraphicsPath на PictureBox, и я позволяю пользователям перемещать строку на картинке с помощью мыши. Теперь я хочу сохранить изображение так, чтобы строка попала на место, где он перетащил его на изображение. Я пробовал это:Нарисовать строку на картинке image

float dx, dy; 
private void closeWindow() 
{ 
    MessageBox.Show(NinjaClass.NINJA.location.ToString()); 
    NinjaClass.NINJA.location = strPoint;//new Point(strPoint.X, strPoint.Y); 

    NinjaClass.NINJA.imgOpened = pictureBox1.Image; 

    Image tmp = Image.FromFile(NinjaClass.NINJA.ImgOrignalPath); 
    Graphics gr = Graphics.FromImage(tmp); 
    gr.DrawString(NinjaClass.NINJA.copyrightStr, NinjaClass.NINJA.font, new SolidBrush(NinjaClass.NINJA.color), new PointF(dx, dy)); 
    NinjaClass.NINJA.imgOpened = tmp; 
    NinjaClass.NINJA.saveOpenedFile(); 


    this.Close(); 
    this.Dispose(); 
} 
///////////////////////////////////////////////////////////// 



private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; 
    gp.Transform(new Matrix(1, 0, 0, 1, dx, dy));//Translate and paint 
    e.Graphics.FillPath(new SolidBrush(color), gp); 
    gp.Transform(new Matrix(1, 0, 0, 1, -dx, -dy));//translate back (reset to old location) 
} 

//MouseDown event handler for your pictureBox1 
private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     strPoint = e.Location; 
     if (gp.GetBounds(new Matrix(1, 0, 0, 1, dx, dy)).Contains(e.Location)) 
     { 
      gp.Transform(new Matrix(1, 0, 0, 1, dx, dy)); 
     } 
    } 
    else if (e.Button == MouseButtons.Right) 
    { 
     pboxPoint = e.Location; 
    } 
} 
//MouseMove event handler for your pictureBox1 
private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     dx = e.X - strPoint.X; 
     dy = e.Y - strPoint.Y; 
     pictureBox1.Invalidate(); 
     NinjaClass.NINJA.location = new PointF(strPoint.X, strPoint.Y); 
    } 
    else if(e.Button == MouseButtons.Right) 
    { 
     pictureBox1.Left += e.X - (int)pboxPoint.X; 
     pictureBox1.Top += e.Y - (int)pboxPoint.Y; 
     //NinjaClass.NINJA.location = pictureBox1.Location; 
    } 

} 

private void ScaleWindow_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if ((e.KeyChar == (char)Keys.Enter) || (e.KeyChar == (char)Keys.Space) || (e.KeyChar == (char)Keys.Escape)) 
    { 
     this.closeWindow(); 
    } 
} 

Но я столкнулся с некоторой проблемой положения. Я имею в виду, что строка сохраненного изображения имеет другое положение, чем позиция, в которой пользователь перетаскивал ее на изображение.

Update: Вот функция, которая сохраняет изображение:

public void saveOpenedFile() 
{ 
    imgOpened.Save(imgSavePath); 
    MessageBox.Show("Saved as ' " + imgSavePath + " '"); 
} 
+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Что такое SizeMode в окне изображения? Это может принять в этом участие! –

+0

Является ли 'saveOpenedFile()' этим? Где этот код? И где значения для этого исходят из: 'new PointF (dx, dy)'? – DonBoitnott

ответ

0

В методе closeWindow, интересно, почему вы установите значение NinjaClass.NINJA.imgOpened дважды. Я думаю, вы должны внести изменения в изображение в pictureBox1 вместо оригинального изображения, которое вы загрузили до tmp объект.

Не могли бы вы попробовать этот код?

float dx, dy; 
private void closeWindow() 
{ 
    MessageBox.Show(NinjaClass.NINJA.location.ToString()); 
    NinjaClass.NINJA.location = strPoint;//new Point(strPoint.X, strPoint.Y); 

    Graphics gr = Graphics.FromImage(pictureBox1.Image); 
    gr.DrawString(NinjaClass.NINJA.copyrightStr, NinjaClass.NINJA.font, new SolidBrush(NinjaClass.NINJA.color), new PointF(dx, dy)); 
    NinjaClass.NINJA.imgOpened = pictureBox1.Image; 
    NinjaClass.NINJA.saveOpenedFile(); 


    this.Close(); 
    this.Dispose(); 
} 
Смежные вопросы