【发布时间】:2016-12-13 18:54:32
【问题描述】:
我对此进行了编码以在图片框上刮擦图像。
bool draw = false;
int pX = -1;
int pY = -1;
Bitmap drawing;
public Form1()
{
drawing = new Bitmap(transformedImage.Width, transformedImage.Height, transformedImage.CreateGraphics());
Graphics.FromImage(drawing).Clear(Color.Transparent);
}
private void transformedImage_MouseMove(object sender, MouseEventArgs e)
{
if (draw)
{
int penWidth = Convert.ToInt32(penWidthValue.Value);
if(blackCheck.Checked == true) ///black pen
{
Graphics panel = Graphics.FromImage(drawing);
Pen pen = new Pen(Color.Black, penWidth);
pen.EndCap = LineCap.Round;
pen.StartCap = LineCap.Round;
panel.DrawLine(pen, pX, pY, e.X, e.Y);
transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
}
else if(redCheck.Checked == true) /// red pen
{
Graphics panel = Graphics.FromImage(drawing);
Pen pen = new Pen(Color.Red, penWidth);
pen.EndCap = LineCap.Round;
pen.StartCap = LineCap.Round;
panel.DrawLine(pen, pX, pY, e.X, e.Y);
transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
}
else if(yellowCheck.Checked == true) /// yellow
{
Graphics panel = Graphics.FromImage(drawing);
Pen pen = new Pen(Color.Yellow, penWidth);
pen.EndCap = LineCap.Round;
pen.StartCap = LineCap.Round;
panel.DrawLine(pen, pX, pY, e.X, e.Y);
transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
}
else /// green
{
Graphics panel = Graphics.FromImage(drawing);
Pen pen = new Pen(Color.Green, penWidth);
pen.EndCap = LineCap.Round;
pen.StartCap = LineCap.Round;
panel.DrawLine(pen, pX, pY, e.X, e.Y);
transformedImage.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
}
}
pX = e.X;
pY = e.Y;
}
private void transformedImage_MouseDown(object sender, MouseEventArgs e)
{
if (scratchCheck.Checked == true)
{
draw = true;
pX = e.X;
pY = e.Y;
}
}
private void transformedImage_MouseUp(object sender, MouseEventArgs e)
{
draw = false;
}
private void transformedImage_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImageUnscaled(drawing, new Point(0, 0));
}
但是当我使用这个保存图像时:
SaveFileDialog sfd = new SaveFileDialog();
sfd.Title = "Select Save Location";
sfd.InitialDirectory = @"Save_Path";
sfd.AddExtension = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
switch (Path.GetExtension(sfd.FileName).ToUpper())
{
case ".BMP":
bmp.Save(sfd.FileName, ImageFormat.Bmp);
break;
case ".gif":
bmp.Save(sfd.FileName, ImageFormat.Gif);
break;
case ".JPG":
bmp.Save(sfd.FileName, ImageFormat.Jpeg);
break;
case ".JPEG":
bmp.Save(sfd.FileName,ImageFormat.Jpeg);
break;
case ".PNG":
bmp.Save(sfd.FileName, ImageFormat.Png);
break;
case ".png":
bmp.Save(sfd.FileName, ImageFormat.Png);
break;
default:
break;
}
}
picturebox 上划伤的图像没有划伤。
如何保存图片连同划痕?,非常感谢。
【问题讨论】:
-
小挑剔。在您的 switch 语句 (
Path.GetExtension(sfd.FileName).ToUpper()) 中,您不需要包含小写变体:case ".gif":,因为它们永远不会被击中。 -
我们需要查看更多
SaveFileDialog()代码。 (你怎么称呼它?) -
我在按钮中编写了 SaveFileDialog() 代码,将图像保存在图片框上。
-
什么是
bmp???应该是drawing??还简化了您的鼠标移动方法。每个if语句之间的唯一区别是PenColor。难道你不能轻易地将 if 语句更改为只设置 Pen 实例,那么你只需要一个部分来实际绘制划痕......参见这个例子......dotnetfiddle.net/rEQKzB -
@FrankerZ 已解决,我使用图像变量将其与划痕一起保存。
标签: c# visual-studio image-processing picturebox