Tag: gdi +

Bitmap.Save“对象目前正在其他地方使用”线程问题

我有一些像这样的代码: public void SaveImage(int Counter) { var task = Task.Factory.StartNew(() => { var image = FinalImage; if (image != null) { image.Save(FinalImageSaveLocation + “test” + Counter + “.bmp”); } }, TaskCreationOptions.PreferFairness); } 我有一个for循环使用类似的代码创建x数量的图像: for(int i = 0; i < 100; i++) { Pencil.DrawImage(image, x, y); //Pencil is created at a initialisation stage SaveImage(i); //by Pencil […]

将ScaleTransform应用于图形GDI +

我把这个简单的代码放在一起画一条线。 现在我想将ScaleTransform应用到它10倍; 但是下面的代码不起作用。 var bitmap = new Bitmap(pictureBox1.Size.Width, pictureBox1.Size.Height); var g = Graphics.FromImage(bitmap); pictureBox1.Image = bitmap; var pn = new Pen(Color.Wheat, -1); g.DrawLine(pn, 0, 0, 10, 10); pn.Dispose(); // I’m trying to scaletransform here! g.ScaleTransform(10, 10); 更新: 更新更改的正确方法是什么? 我没有得到任何结果:( g.ScaleTransform(1, 1); pictureBox1.Invalidate();

将操纵的图形绘制到另一个图形中

我想把一个被操纵的图形绘制成另一个: // I have two graphics: var gHead = Graphics.FromImage(h); var gBackground = Graphics.FromImage(b); // Transform the first one var matrix = new Matrix(); matrix.Rotate(30); gHead.Transform = matrix; // Write the first in the second gBackground.DrawImage(h, 200, 0, 170, 170); 输出是头部img的背景img – 但是头部img没有旋转。 我错过了什么?

保存到MemoryStream时,Image.Saveexception“GDI +中发生了一般错误。”

我有一个服务器 – 客户端应用程序,我想从服务器获得一个屏幕截图,但在线 bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 我得到了这个例外: A generic error occurred in GDI+. private Socket ScreenSocket; private MemoryStream ms; public void ConnectScreenShot(IPEndPoint ep) { if (ScreenSocket != null) { ScreenSocket.Dispose(); ScreenSocket = null; } if (ms != null) { ms.Dispose(); ms = null; } ScreenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ScreenSocket.Connect(ep); ms = new MemoryStream(); Rectangle […]

使用对EnumFontFamiliesEx的DLL调用在C#中枚举活动字体让我知道了

我的最终目标是在Windows计算机上列出所有活动字体。 例如,如果您启动写字板或Word,您将看到它们全部。 其中一些字体来自windows \ fonts文件夹,但不是全部。 有些是使用gdi32.dll调用AddFontResource(…)动态注册的。 现在,你会认为C#支持检索整个列表,如果有,请告诉我! 但是,在花了好几个小时后,常规的C#调用获取安装的系统字体只检索实际上活动的所有字体中的一些。 例如,InstalledFontCollection.Families没有找到AddFontResource添加的任何字体(它找到了wordpad中列出的大约25%的字体!) 虽然我想在C#中执行此操作,但似乎我必须使用更多gdi32.dll调用。 这样就开始了我的EnumFontFamiliesEx问题。 我已经设法让以下代码工作到我正在获得一堆字体回调。 但是,结构ENUMLOGFONTEX似乎已损坏,例如lpelfe.elfFullName通常包含几个方形字符,而不是真实姓名。 也许我在编组或结构定义中犯了一个错误,不太确定。 我尝试了很多迭代和无休止的谷歌搜索,但无济于事。 任何帮助将非常感谢。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Media; using System.Runtime.InteropServices; using Microsoft.Win32; namespace FontRetriever { public partial class TestForm : Form { [DllImport(“gdi32.dll”)] static extern int EnumFontFamiliesEx(IntPtr hdc, [In] […]

用透明背景更改图像颜色

我需要使用c#(System.Drawings)将透明背景上带绿色圆圈的图像加载到位图图像中。 这很容易。 但是,我需要在将圆圈添加到更大的图像之前更改圆圈的颜色,而不会影响周围的透明度。 在我的情况下,我需要将圆形颜色更改为黄色并将其添加为太阳。 我不能使用固定的黄色圆圈图像,因为所需的颜色是动态的。 所以在下面的代码中,如何在将图像添加到位图之前更改图像的颜色? Image i = Image.FromFile(greenCircleFile); Bitmap b = new Bitmap(500, 500); using(Graphics g = Graphics.FromImage(b)) { //–> Here I need to change the color of the green circle to yellow //afterwards I can add it to the bitmap image g.DrawImage(i, 0, 0, 500, 500); } 请注意,需要考虑两件事:保持形状(圆圈)的抗锯齿,颜色需要由用户拾取并按原样使用以覆盖圆的原始颜色。 固定: 感谢@TaW,他提供了正确的答案。 然而,有一个小故障,这是最适合我的版本: Image […]

在.NET中组合多个PNG8图像的最简单方法

我试图将一堆8位PNG图像组合成一个C#中较大的PNG图像。 奇怪的是,这似乎特别困难。 由于Graphics不支持索引颜色,你不能使用它,所以我尝试构建一个非索引的Bitmap(使用Graphics)并将其转换为索引颜色位图。 转换很好,但我无法弄清楚如何设置输出图像的调色板。 它默认为一些预定义的调色板,与我正在寻找的内容几乎没有关系。 所以: 有没有办法控制位图调色板? 或者是否有另一种方法(例如System.Windows.Media.Imaging.WriteableBitmap)可以支持这个? Re:WriteableBitmap:我似乎无法在网上找到任何关于如何在这种情况下组合PNG的例子,或者即使尝试它也没有任何意义。

c#将图像(缩放)绘制到图形,不进行正确插值。 修复?

我的图像宽1px,有些高度。 我需要在它的OnPaint事件的控件的整个宽度上绘制这个图像。 我得到它画,但不正确。 看起来当它拉伸它时,它实际上并没有填满所有像素。 好像插值关闭了。 有没有办法说“停止聪明,只是画出来”? 我在图形对象的选项中看不到InterpolationMode.Off或.None。 我可以通过使用宽度为X的图像来确认我实际上绘制了整个宽度,其中X与控件的宽度相同。 然后当它绘制时,它正常覆盖整个区域。 然而,这个控件一直在resize,并且为了节省内存,所有使用1px宽图像的爵士乐在网络世界中是很正常的。 这适用于桌面C#应用程序。 有想法该怎么解决这个吗?

如何在不使用Bitmap.MakeTransparent()的情况下将图像设置为在C#中具有透明背景?

我想将图像设置为具有透明背景,但我不想用透明度替换特定颜色的所有像素。 更具体地说,图像是文件夹的缩略图图像,通过IShellItemImageFactory.GetImage获得。 这给了我一个位图,如Windows资源管理器缩略图视图中所示,但背景为纯白色。 我可以在它上面使用Bitmap.MakeTransparent,这在大多数情况下都适用,但在任何情况下缩略图图像都包含白色(例如,包含图像的文件夹,包括白色)。 很明显,这是十多年来作为开发人员的第一次,在搜索我的问题后,我没有在任何地方找到答案,我实际上不得不自己问一下。 (我认为这意味着我只是升级了!Yippee,我现在是二级开发人员…)

确定GDI句柄和USER对象的数量

我们为Windows窗体UI渲染引擎开发了一个小型测试套件,可以在自动运行测试用例的同时测量性能并检测内存泄漏。 现在我们也想检查手柄泄漏。 在桌面平台上,我们可以使用以下代码: [DllImport(“User32”)] private extern static int GetGuiResources(IntPtr hProcess, int uiFlags); using (var process = Process.GetCurrentProcess()) { var gdiHandles = GetGuiResources(process.Handle, 0); var userHandles = GetGuiResources(process.Handle, 1); } 此方法似乎在Windows Mobile中不可用。 是否有另一种方法可以在Windows Mobile / CE上以编程方式确定这些值?