【问题标题】:Scratch Image on PictureBox C#PictureBox C#上的临时图像
【发布时间】: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


【解决方案1】:

两个常见错误:

  1. 使用CreateGraphics 不会创建持久图形。所以:总是在PictureBoxPaint 事件中绘制所有内容! MouseMove 应该只收集List<Point>List<List<Point>> 中的点。 所有绘图必须发生在Paint事件中,使用它的e.Graphics对象!

  2. 只有当您使用DrawToBitmap 创建一个新位图时,表面上的绘图才会被保存,该位图最多可组合三层BackgroundImageImage以及所有永久图纸。

有关绘图示例,请参阅here,有关使用DrawToBitmap 的示例,请参阅here

作为在Image 上绘制的推荐方式的替代方法,您也可以直接在其中绘制。这实际上是在MouseMove 中所做的,但后来您忽略了图像并以非持久方式绘制它。

最后:Save 例程正在保存一个您没有显示给我们的bmp,因此我们只能得出结论,它是您加载的原始Image。也许drawing.Save(..) 会有所帮助..

但是代码有很多问题,你真的应该完全重写,从令人困惑的名字开始! (提示:不要将对象称为不同类型的名称,例如Graphics panel!!!)显然PenColor 类型的变量也有助于避免这些重复...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2014-08-06
    • 2011-11-15
    • 1970-01-01
    • 2011-07-06
    • 2015-05-15
    • 2019-05-31
    相关资源
    最近更新 更多