Как сохранить рисунок Графика в растровое изображение? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу сохранить изменения, сделанные мною с графикой, в файл растрового изображения. У меня есть изображение с камеры в pictureBox, и когда у меня есть щелчок мышью, я добавляю сетку и указываю на изображение (как я понимаю, перед изображением), после этого я хочу сохранить рисунок с IMG с камеры, но я беру только img без рисования сетки и точек. Как я должен это делать? Я создаю графику так:

 g = Graphics.FromHwnd(postureImg.Handle);
 SolidBrush brush_Grey = new SolidBrush(Color.Black);
 SolidBrush brush_Gold = new SolidBrush(Color.Gold);                   
 Rectangle rect = new Rectangle(dPoint1, new Size(10, 10));
 g.FillEllipse(brush_Gold, rect);                   

 points[i] = new Point(e.X, e.Y);
       i++;
       if (i >= 2)
       {
        Pen myPen = new Pen(Color.Red);
        myPen.Width = 1;
        g.DrawLine(myPen, points[0].X, points[0].Y, points[1].X, points[1].Y);
        }
        g.Dispose();

В следующий раз я сделаю g.DrawLine и g.FillEllipse и получу следующее изображение: enter image description here Как я могу взять это изображение в растровое изображение? Спасибо за помощь!

1 Ответ

0 голосов
/ 28 августа 2018

Хорошо, краткое руководство о том, что вы делаете.

Прежде всего, объект Graphics? Все, что он делает, это модифицирует необработанное изображение / растровое изображение, на которое вы указываете. В этом случае вы изменяете необработанное изображение / растровое изображение, которое содержится в вашем postureImg. Вот почему вам не нужно «повторно импортировать» изображение обратно в этот pictureBox - потому что графика изменяет его на месте.

Это означает, что после этого все, что вам нужно сделать, это сохранить это необработанное изображение / растровое изображение в файл - так что вы действительно спрашиваете: «Как сохранить растровое изображение в PictureBox?» в файл? "

В этом случае ответ довольно прост:

postureImg.Image.Save(@"C:\someplace.jpg", ImageFormat.Jpeg);

РЕДАКТИРОВАТЬ: Ах, я забыл, что VS делает некоторые изворотливые вещи с PicBox - у него есть «фактическое» изображение и «отображаемое» изображение. То, что вы редактировали, это «отображаемое» изображение, которое не является постоянным (оно исчезнет, ​​если форма обновится.)

Если честно, вам, вероятно, будет лучше, если вы никогда не пойдете прямо с изображения в графическом окне. Например, вот код, который не работает:

Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
SolidBrush brush_Grey = new SolidBrush(Color.Green);
SolidBrush brush_Gold = new SolidBrush(Color.Red);
Rectangle rect = new Rectangle(new Point(100, 100), new Size(10, 10));
g.FillEllipse(brush_Gold, rect);
g.Dispose();
pictureBox1.Image.Save(@"C:\tmpSO1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

... хорошая подсказка, что это не сработает, если вы выполните это при загрузке формы, он не будет отображать красный круг; и если форма должна обновиться из-за отсечения или тому подобного, красный круг исчезнет.

В любом случае, вот код, который работает:

Bitmap bmp = new Bitmap(pictureBox1.Image);
Graphics g = Graphics.FromImage(bmp);
SolidBrush brush_Grey = new SolidBrush(Color.Green);
SolidBrush brush_Gold = new SolidBrush(Color.Red);
Rectangle rect = new Rectangle(new Point(100, 100), new Size(10, 10));
g.FillEllipse(brush_Gold, rect);
g.Dispose();
pictureBox1.Image = bmp;
pictureBox1.Image.Save(@"C:\tmpSO2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);

Вместо того, чтобы модифицировать PictureBox на месте, из него загружается отдельный BMP, и обратно в него.

...