Tag: 绘制

在resize时将图像绘制到Panel控件上会产生伪影

目前我正在尝试做我认为简单的任务: 在Windows窗体中的Panel控件的整个区域上绘制图像 。 (请忽略我可以使用BackgroundImage属性的那一刻) 要绘制的图像如下所示: 即一个黄色的盒子,周围有一个1像素的蓝色框架。 要绘制,我正在使用Panel控件的Paint事件: private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); } 这在最初显示表单时看起来很好: 调整窗体大小(以及停靠的面板)时,它会在缩小时缩小边缘… …或者当它变得更大时它会绘制人工制品: 我很确定有一些相当简单和直接的东西,但我真的无法理解其中的原因。 因为我忽略了ClipRectangle并总是绘制所有内容,所以我认为图像会一直缩放。 我的问题是: 这些文物的原因是什么? (我喜欢理解这一点!) 为了摆脱人工制品,我该怎么做? (在每次resize时调用Invalidate旁边) 更新,解决方案: 感谢Ryan的回答 ,我找到了一个可接受的解决方案。 基本上我从Panel派生了一个类,重写了OnPaintBackground并且没有调用基本方法。 最后,我将以下代码添加到派生面板的构造函数中: base.DoubleBuffered = true; SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles();

如何在图片框中绘制边缘上标记的多边形

我试过这种方式,但我没有得到所需的结果: System.Drawing.Point[] p = new System.Drawing.Point[6]; p[0].X = 0; p[0].Y = 0; p[1].X = 53; p[1].Y = 111; p[2].X = 114; p[2].Y = 86; p[3].X = 34; p[3].Y = 34; p[4].X = 165; p[4].Y = 7; g = PictureBox1.CreateGraphics(); g.DrawPolygon(pen1, p); 我想要做的是在picturebox中绘制一个多边形,该多边形使用不同的颜色并根据速率(角的数量和边的坐标)定义

在C#中的单色位图上绘制文本

我的问题是我需要在单色位图上绘制文本。 生成的位图必须打印在热敏POS打印机上,因此位图必须为1bpp。 我的图形不好,所以我试图找一些样品。 这是我尝试过的: Bitmap bmp = new Bitmap(300, 300, PixelFormat.Format1bppIndexed); using (Graphics g = Graphics.FromImage(bmp)) { Font font = new Font(“Arial”, 20, FontStyle.Bold, GraphicsUnit.Point); g.Clear(Color.White); g.DrawString(text, font, Brushes.Black, 0, 0); } bmp.Save(@”c:\x\x.bmp”, ImageFormat.Bmp); 最后保存只是为了检查结果。 使用此代码,我得到以下exception:无法从具有索引像素格式的图像创建Graphics对象。 是否有任何方法可以将文本绘制到单色内存位图? 仅供参考:我需要这个,因为我的愚蠢POS打印机绘制的0与O完全相同,所以它们无法区分……

立方Hermite Spline表现得很奇怪

我正在尝试使用Cubic Hermite Splines绘制图形。 我从这个插值方法页面中抓取了这样做的简单代码。 这是我的代码: private float HermiteInterpolate(float y0, float y1, float y2, float y3, float mu) { var mu2 = mu * mu; var a0 = -0.5f * y0 + 1.5f * y1 – 1.5f * y2 + 0.5f * y3; var a1 = y0 – 2.5f * y1 + 2f * y2 – […]

在Windows窗体中有效地绘制网格

我正在用C#编写Conway的生命游戏的实现。 这是我用来绘制网格的代码,它在我的panel_Paint事件中。 g是图形上下文。 for (int y = 0; y < numOfCells * cellSize; y += cellSize) { for (int x = 0; x < numOfCells * cellSize; x += cellSize) { g.DrawLine(p, x, 0, x, y + numOfCells * cellSize); g.DrawLine(p, 0, x, y + size * drawnGrid, x); } } 当我运行我的程序时,它没有响应,直到它完成绘制网格,这需要几秒钟在numOfCells = 100&cellSize = […]

如何在.Net中调整(缩小)EMF(元文件)?

我有一个EMF文件。 我想把它缩小一点。 如何在.net(或任何工具)中执行此操作而不会出现模糊图像 ? 生成的已resize的图像将转换为另一种格式(png / jpg /无论如何),我可以处理(我认为)。 我还没有在.Net(或任何语言平台)中找到一个处理emf / metafiles的明确例子。 我用GDI +查看了图形编程,但它只引入了Metafiles。 我已经尝试了Image Magick,但你必须转换为另一种格式(我还需要做),结果很模糊(例如缩小并转换为png)。 我已经尝试过Inkscape,但是你只能导入一个EMF文件,并且Inkscape将它倒置并且不成比例地导入到现有的绘图中。 另外,(不要笑)我已经在Window’s Paint中打开了它(少数几个将打开emf的图像编辑软件程序之一)并调整了绘图大小,再次模糊。 更新:这是我用来resize的代码。 这样可行,但生成的图像模糊不清。 代码只是一个通用的图像重新调整例程,不是特定于EMF的 private static Image resizeImage(Image imgToResize, Size size) { int sourceWidth = imgToResize.Width; int sourceHeight = imgToResize.Height; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)size.Width / (float)sourceWidth); nPercentH […]

在C#中将旋转的文本绘制到图像

我正在使用Graphics类的drawtring方法在Image上绘制一个String。 g.DrawString(mytext, font, brush, 0, 0); 我正在尝试使用图形对象的旋转变换function按角度旋转文本,以便可以以任何角度绘制文本。如何使用旋转变换来执行此操作。 我使用的旋转变换代码是 Bitmap m = new Bitmap(pictureBox1.Image); Graphics x=Graphics.FromImage(m); x.RotateTransform(30); SolidBrush brush = new SolidBrush(Color.Red); x.DrawString(“hi”, font,brush,image.Width/2,image.Height/2); //image=picturebox1.image pictureBox1.Image = m; 文本是以旋转的角度绘制的,但它不是在我想要的中心绘制.Plz帮助我。

如何根据鼠标的移动绘制矩形?

我在这里找到了用于在表单上绘图的示例代码: http://msdn.microsoft.com/en-us/library/aa287522(v=vs.71).aspx 作为此要求的后续(发现哪些控件位于用户拖动鼠标所描述的矩形下方): 我的控件的位置与我的MouseDown和-Up事件的位置之间似乎不匹配 …我想为用户提供关于他们将要选择的内容的即时/持续反馈(何时/如果他们释放鼠标按钮)。 我想不仅仅是在鼠标移动后绘制一条线,而是绘制正在描述的矩形。 我认为MouseMove事件加上上面两个链接的代码可以解决这个问题,但这种情况经常被解雇/会对性能产生什么影响呢? 如果是这样,什么是一个更好的事件来挂钩,或者计时器是什么方式去这里? UPDATE 这段代码改编自John的下面的示例(唯一的区别是StackOverflow-引发对base。*的注释被注释掉了,我将颜色从红色变为黑色(没有引用Stendahl的意图)), 除了先前绘制的矩形之外还有效释放鼠标后再次显示。 IOW,第一个矩形完美绘制 – 它随着鼠标单击(按预期)消失。 但是,当我通过按下鼠标左键并向下并向右拖动来描述第二个矩形时,第一个矩形会再次显示! 并且这种情况将继续发生 – 每个先前绘制的矩形都会被记住,并在绘制新矩形时重新出现。 公共部分类Form1:表单{私有点? _开始; private Rectangle _previousBounds; public Form1() { InitializeComponent(); } private void Form1_MouseDown(object sender, MouseEventArgs e) { _start = e.Location; //base.OnMouseDown(e); } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (_start.HasValue) DrawFrame(e.Location); //base.OnMouseMove(e); } private void Form1_MouseUp(object […]

在Winforms中绘制一个闪烁的插入符号

我正在开发一个自定义控件,它最像一个文本区域。 我正在绘制文本,它正常工作,并接受也可以工作的输入..但是我(用户)在我输入的时候会猜测插入符号的位置,因为我正在手动执行所有操作。 如何绘制闪烁的插入符号以显示我当前正在键入的位置? 有没有标准的方法来做到这一点?

每秒运行一次Visual C#

我有计时器的问题。 我在函数中有函数(在函数中绘制) void func(){ /*…do something … */ for(){ for() { /*loop*/ draw(A,B, Pen); } /*… do something …*/ } } 这是绘图function public void draw1(Point Poc, Point Kra, Pen o) { Graphics g = this.CreateGraphics(); g.DrawLine(o,Poc.X+4, Poc.Y+4,Kra.X+4, Kra.Y+4); g.Dispose(); } 我在按钮点击时调用函数’func’ private void button4_Click(object sender, EventArgs e){ func(); } 我想调用绘制函数evry second(每秒绘制一行)。 在绘图之间,函数需要继续工作并计算=循环,并绘制下一行一段时间(间隔)。 我试过了 timer1.Tick += […]