Tag: 图形

打印时如何确定字符串的宽度?

我正在创建一个自定义控件,其中一部分是使用Graphics类将颜色绘制到表单中。 目前我正在使用以下代码来显示它: private float _lineHeight { get { return this.Font.Size + 5; } } private void Control_Paint(object sender, PaintEventArgs e) { Graphics g = this.CreateGraphics(); Brush b = new SolidBrush(Colors[7]); g.DrawString(“Hello World!”, this.Font, b, 0, 2); g.DrawString(“This has been a test of the emergency drawing system!”, this.Font, b, 0, 2 + _lineHeight); } 我目前正在使用固定宽度字体,我想知道字体显示的宽度,但似乎没有这种信息的任何属性。 有没有办法获得它? […]

桌面屏幕叠加 – 新forms的闪烁问题

作为我的开源DeskPins 克隆的一部分 (两个单独的链接,一个用于原始,一个用于GitHub上的克隆),我需要允许用户与桌面交互。 我认为最简单的方法是打开一个新表单并在其上绘制桌面内容。 然后我应该能够轻松设置鼠标光标并为用户提供关于当前焦点的窗口的视觉提示。 更复杂的替代方法是使用p / invoke到SetSystemCursor并在其他窗口的WM_PAINT事件队列中注入自定义代码(以及可能的其他WinApi相关工作,例如,如果我的程序exception终止,则游标清理将是一个问题)。 我不想这样做。 我下面的代码正在工作,唯一的问题是屏幕闪烁 。 设置DoubleBuffered = true后,它变得更好(而不是屏幕闪烁,它变成了父窗体闪烁 ),但仍然很明显。 所以现在每次打开叠加表单时我的表单都会闪烁。 我能做些什么来使它平稳过渡,就好像新窗口没有打开一样? 有一个“冻结”效果是可以的=任何动画都会被暂停。 public sealed partial class DesktopOverlayForm : Form { public DesktopOverlayForm() { InitializeComponent(); //make full screen //http://stackoverflow.com/a/2176683/897326 Rectangle bounds = Screen.AllScreens .Select(x => x.Bounds) .Aggregate(Rectangle.Union); this.Bounds = bounds; //set desktop overlay image this.BackgroundImage = MakeScreenshot(); } /// /// […]

在3D地形上,给定3D线,找到线和地形之间的交点

我有一个三维地形网格,每个网格的每个坐标(x,y,z)都是已知的。 现在,我有一个单调增加/减少的线,其起点也是已知的。 我想找到地形和线相交的点。 算法是做什么的? 我能想到的是将3D地形的坐标存储在nxn矩阵中。 然后我会根据地形中的网格对线进行分段。 然后我将从最接近该线的网格开始,然后尝试计算该平面是否与该线相交,如果是,则获取坐标并退出。 如果不是,那么我将进入下一部分。 但我的算法是最好的还是最优的解决方案? 或者是否有任何现有的库已经这样做了?

winforms图形与最近邻居过滤图像的剪切边缘

我正在写一个Chip8模拟器/解释器。 它很棒。 到目前为止,我需要一个用户界面来玩一些游戏并观看这个糟糕的jackson。 我首先遇到了一个问题,即在屏幕上绘制帧缓冲区(这只是一个位图)非常模糊。 搞清楚之后我需要将插值模式设置为最近邻,它看起来好多了,但是看起来图像的边缘要么被剪裁,要么我在工作时误解了插值。 这是一个截图。 您在顶部,左侧和右侧看到的边缘应以“整个”白色像素结束,与您看到的图案保持一致。 特别容易看到左上角的问题,应该是一个完整的白色像素。 被放大的图像是64×32,并且正在使用普通图形对象绘制,如下所示:(忽略64 * 6,我知道它很有趣) g.DrawImage (cpu.raster, 0, 0, 64 * 6, 32 * 6); 其中“cpu.raster”是模拟器渲染游戏的位图。 我会发布剩下的代码,但这看起来很标准。 唯一与图形相关的其他代码是插值/平滑模式,它们设置如下: g = this.CreateGraphics (); g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; this.DoubleBuffered = true; 我应该注意另一个设置来防止这种情况吗? 我试着减小绘制图像的大小,想到可能表单是以某种方式剪切它,但事实并非如此,图像结束于您在屏幕截图中看到的边缘。

c#GDI边缘空白检测算法

我正在寻找一种从c#托管的GDI +库中检测 c#位图的边缘空白的解决方案。 图像可以是透明的或白色的 ,400x图像中的大多数是8000x8000px,边缘周围有大约2000px的空白。 找出边缘, x,y,高度和宽度坐标的最有效方法是什么? 我尝试逐像素,但发现它很慢。 更新到解决方案 –添加左/右/上/下边界 图像细节中心图像的问题现在裁剪任何透明(0%)或白色(#FFFFFF)像素。 var top = bitmap.Height; var left = bitmap.Width; var right = 0; var bottom = 0; … var pData = pData0 + (y * data.Stride) + (x * 4); var xyAlpha = pData[3]; var xyBlue = pData[0]; var xyGreen = pData[1]; var xyRed = […]

C# – 调整图像canvas大小(保持源图像的原始像素尺寸)

我的目标是拍摄一个图像文件并将尺寸增加到下一个2的幂,同时保留像素(也就是不缩放源图像)。 所以基本上最终结果将是原始图像,以及跨越图像右侧和底部的额外白色空间,因此总尺寸是2的幂。 下面是我正在使用的代码; 这会创建具有正确尺寸的图像,但由于某种原因,源数据会略微缩放和裁剪。 // Load the image and determine new dimensions System.Drawing.Image img = System.Drawing.Image.FromFile(srcFilePath); Size szDimensions = new Size(GetNextPwr2(img.Width), GetNextPwr2(img.Height)); // Create blank canvas Bitmap resizedImg = new Bitmap(szDimensions.Width, szDimensions.Height); Graphics gfx = Graphics.FromImage(resizedImg); // Paste source image on blank canvas, then save it as .png gfx.DrawImageUnscaled(img, 0, 0); resizedImg.Save(newFilePath, System.Drawing.Imaging.ImageFormat.Png); 看起来源图像是基于新的canvas大小差异缩放的,即使我使用的是一个名为DrawImageUnscaled()的函数。 请告诉我我做错了什么。

使用希尔伯特曲线分析图像

我想使用希尔伯特曲线的“路径”访问图像的每个像素。 我在这里找到了Hilbert-cuve的递归实现,但我不知道如何在图像上应用它。 宽度和高度相等的图片是否重要?

如何附加两个画笔类

是否有任何方法或解决方法将两个System.Drawing.Brush类组合/附加在一起? 例如, Brush b1 = GetFromSomewhere(); Brush b2 = GetFromSomewhereElse(); (类似的东西……) Brush b3 = b1 + b2; 最终我的目的是做一些事情: Graphics graphics = new Graphics; graphics.FillRectangle(b3, rectangle); 更新:我有一个第三方库(无法控制它),它为我提供了一个预定义的Brush实例(代表填充模式,例如++++或#####)。 我想用“自己的”画笔模式“覆盖”该实例。

使用.NET删除矩形?

我可以删除我绘制的旧矩形并绘制一个新的矩形吗? private void panel1_MouseClick(object sender, MouseEventArgs e) { Graphics g = this.panel1.CreateGraphics(); Pen pen = new Pen(Color.Black, 2); g.DrawRectangle(pen, 100,100, 100, 200); g.dispose(); }

C#:使用Bitmaps时如何减少内存和CPU消耗?

我有一个Windows应用程序项目,处理图像编辑(裁剪和resize)。 不幸的是,这些图像处理消耗了大量的内存和CPU资源(很容易达到600MB或50%cpu),而且只需裁剪和调整一个重量为2.5MB(2300 * 5400px)的gif图像。 更重要的是,由于大量的资源消耗,程序在resize时卡住… public static Image Resize(Image imgToResize, Size size) { Bitmap b = new Bitmap(size.Width, size.Height); Graphics g = Graphics.FromImage((Image)b); g.InterpolationMode = InterpolationMode.Default; g.SmoothingMode = SmoothingMode.HighSpeed; g.PixelOffsetMode = PixelOffsetMode.Default; g.DrawImage(imgToResize, 0, 0, size.Width, size.Height); g.Dispose(); return (Image)b; } public static Image Crop(Image img, Point p1, Point p2) { Rectangle cropArea = new […]