C# 将图片保存到bmp
我有以下代码:C# 将图片保存到bmp,c#,visual-studio-2010,save,paint,C#,Visual Studio 2010,Save,Paint,我有以下代码: Dictionary<int, Class1> MyDict = new Dictionary<int, Class1>(); Dictionary MyDict=newdictionary(); 我知道鼠标的位置 private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { Mycl.X1 = e.X;
Dictionary<int, Class1> MyDict = new Dictionary<int, Class1>();
Dictionary MyDict=newdictionary();
我知道鼠标的位置
private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{ Mycl.X1 = e.X;
Mycl.X2 = e.Y;}
private void panel1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
Mycl.X3 = e.X;
Mycl.X4 = e.Y;
MyDict.Add(MyDict.Count + 1, Mycl);
panel1.Invalidate();
Mycl = new Class1();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
if (panel1.BackgroundImage == null)
{
panel1.BackgroundImage = new Bitmap(this.Width, this.Height);
}
Pen MyPen = new Pen(Color.Black);
Graphics G = Graphics.FromImage(panel1.BackgroundImage);
foreach (KeyValuePair<int, Class1> kvp in MyDict)
{
Point pl1 = new Point(MyDict[kvp.Key].X1, MyDict[kvp.Key].X2);
Point pl2 = new Point(MyDict[kvp.Key].X3, MyDict[kvp.Key].X4);
//e.Graphics.DrawLine(MyPen, pl1, pl2);
G.DrawLine(MyPen, pl1, pl2);
}
}
private void panel 1\u MouseDown(对象发送方,System.Windows.Forms.MouseEventArgs e)
{Mycl.X1=e.X;
Mycl.X2=e.Y;}
专用void panel1_MouseUp(对象发送器,System.Windows.Forms.MouseEventArgs e)
{
Mycl.X3=e.X;
Mycl.X4=e.Y;
MyDict.Add(MyDict.Count+1,Mycl);
1.使无效();
Mycl=新类别1();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
if(panel1.BackgroundImage==null)
{
panel1.BackgroundImage=新位图(this.Width,this.Height);
}
钢笔MyPen=新钢笔(颜色为黑色);
图形G=Graphics.FromImage(panel1.BackgroundImage);
foreach(MyDict中的KeyValuePair kvp)
{
点pl1=新点(MyDict[kvp.Key].X1,MyDict[kvp.Key].X2);
点pl2=新点(MyDict[kvp.Key].X3,MyDict[kvp.Key].X4);
//e、 绘图线(MyPen、pl1、pl2);
G.抽绳(MyPen、pl1、pl2);
}
}
但当我画这幅画时,我遇到了麻烦
当我使用e.graphics.drawline()时,
line已绘制
但是使用G.drawline()
没有线条
最后,我需要保存图片,但使用
e.drawline
我有一张黑色图片。您需要区分屏幕图形和位图对象图形
以下是一个例子:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private Button button1;
private PictureBox pictureBox1;
private Bitmap bmp;
private Point? p1 = null;
public Form1()
{
InitializeComponent();
bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
}
pictureBox1.Image = bmp;
}
private void InitializeComponent()
{
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.button1 = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(0, 23);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(477, 352);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
//
// button1
//
this.button1.Dock = System.Windows.Forms.DockStyle.Top;
this.button1.Location = new System.Drawing.Point(0, 0);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(477, 23);
this.button1.TabIndex = 1;
this.button1.Text = "write bitmap to file";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
//
this.ClientSize = new System.Drawing.Size(477, 375);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.button1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Name = "Form1";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
p1 = pictureBox1.PointToClient(MousePosition);
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
Point p2 = pictureBox1.PointToClient(MousePosition);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawLine(Pens.Black, p1.Value, pictureBox1.PointToClient(MousePosition));
}
p1 = null;
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (p1 != null)
{
e.Graphics.DrawLine(Pens.Black, p1.Value, pictureBox1.PointToClient(MousePosition));
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
pictureBox1.Invalidate();
}
private void button1_Click(object sender, EventArgs e)
{
var dialog=new SaveFileDialog();
dialog.DefaultExt = "bmp";
dialog.ValidateNames = true;
dialog.Filter = "Bitmap|*.bmp";
dialog.AddExtension = true;
dialog.OverwritePrompt=true;
var result=dialog.ShowDialog(this);
if (result == System.Windows.Forms.DialogResult.OK)
{
using (var fs = dialog.OpenFile())
{
bmp.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp);
}
}
}
}
}
在该示例中,您可以看到两个不同的DrawLine(…)调用。。。绘制事件中的一个处理屏幕上的绘制,它不会保留在位图中。。。mouse up中的一个处理位图中的修改…试试看…注意区别,我还为panel1添加了一个MouseMove()处理程序:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private class Class1
{
public int X1, X2, X3, X4;
}
private Class1 Mycl = new Class1();
private Dictionary<int, Class1> MyDict = new Dictionary<int, Class1>();
private void panel1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Mycl.X1 = e.X;
Mycl.X2 = e.Y;
Mycl.X3 = e.X;
Mycl.X4 = e.Y;
Point pt1 = panel1.PointToScreen(new Point(Mycl.X1, Mycl.X2));
Point pt2 = panel1.PointToScreen(new Point(Mycl.X3, Mycl.X4));
ControlPaint.DrawReversibleLine(pt1, pt2, panel1.BackColor);
}
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Point pt1 = panel1.PointToScreen(new Point(Mycl.X1, Mycl.X2));
Point pt2 = panel1.PointToScreen(new Point(Mycl.X3, Mycl.X4));
ControlPaint.DrawReversibleLine(pt1, pt2, panel1.BackColor);
Mycl.X3 = e.X;
Mycl.X4 = e.Y;
pt2 = panel1.PointToScreen(new Point(Mycl.X3, Mycl.X4));
ControlPaint.DrawReversibleLine(pt1, pt2, panel1.BackColor);
}
}
private void panel1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Left)
{
Mycl.X3 = e.X;
Mycl.X4 = e.Y;
MyDict.Add(MyDict.Count + 1, Mycl);
panel1.Invalidate();
Mycl = new Class1();
}
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
using (Pen MyPen = new Pen(Color.Black))
{
foreach (KeyValuePair<int, Class1> kvp in MyDict)
{
Point pl1 = new Point(kvp.Value.X1, kvp.Value.X2);
Point pl2 = new Point(kvp.Value.X3, kvp.Value.X4);
e.Graphics.DrawLine(MyPen, pl1, pl2);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);
panel1.DrawToBitmap(bmp, new Rectangle(new Point(0,0), panel1.Size));
bmp.Save(@"C:\Users\Mike\Pictures\SomeImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私人班级1
{
公共int X1、X2、X3、X4;
}
私有类1 Mycl=新类1();
私有字典MyDict=新字典();
私有void panel 1_MouseDown(对象发送器,System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
Mycl.X1=e.X;
Mycl.X2=e.Y;
Mycl.X3=e.X;
Mycl.X4=e.Y;
点pt1=面板1.点至屏幕(新点(Mycl.X1,Mycl.X2));
点pt2=面板1.点至屏幕(新点(Mycl.X3,Mycl.X4));
ControlPaint.DrawReversibleLine(pt1、pt2、panel1.背景色);
}
}
专用无效面板1u MouseMove(对象发送器,MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
点pt1=面板1.点至屏幕(新点(Mycl.X1,Mycl.X2));
点pt2=面板1.点至屏幕(新点(Mycl.X3,Mycl.X4));
ControlPaint.DrawReversibleLine(pt1、pt2、panel1.背景色);
Mycl.X3=e.X;
Mycl.X4=e.Y;
pt2=面板1.指向屏幕的点(新点(Mycl.X3,Mycl.X4));
ControlPaint.DrawReversibleLine(pt1、pt2、panel1.背景色);
}
}
专用void panel1_MouseUp(对象发送器,System.Windows.Forms.MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
Mycl.X3=e.X;
Mycl.X4=e.Y;
MyDict.Add(MyDict.Count+1,Mycl);
1.使无效();
Mycl=新类别1();
}
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
使用(画笔MyPen=新画笔(颜色.黑色))
{
foreach(MyDict中的KeyValuePair kvp)
{
点pl1=新点(kvp.Value.X1,kvp.Value.X2);
点pl2=新点(kvp.Value.X3,kvp.Value.X4);
e、 绘图线(MyPen、pl1、pl2);
}
}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
位图bmp=新位图(panel1.Width,panel1.Height);
panel1.DrawToBitmap(bmp,新矩形(新点(0,0),panel1.Size));
bmp.Save(@“C:\Users\Mike\Pictures\SomeImage.jpg”,System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
那么您想在面板上绘制点吗?是的,但是使用G.drawline()没有点。请尝试这样看:用户单击,p1设置为。。。现在,随着鼠标移动,picturebox将无效,因此它将重新绘制。。。重新绘制后,它会在屏幕上绘制一条从p1到鼠标当前位置的线。。。释放鼠标后,从p1到鼠标当前位置的一条线将绘制到位图,p1将重置为空。这太完美了!这就是工作!非常感谢你!现在,我坐着,明白了。)可以在ControlPaint中绘制椭圆吗?我总是有一个好的角度!你需要一个更坚固的设计和方法来处理其他形状。