Tag: 位图

为什么我没有内存泄漏.Dispose()我将.Save()的位图发送到MemoryStream?

假设我创建了一个位图 Bitmap bitmap = new Bitmap(320, 200); 当我把它写到某个流(在我的情况下,它是一个HttpResponseStream,由HttpListenerResponse给出),一切都很好: bitmap.Save(stream, ImageFormat.Png); 我不需要bitmap.Dispose(),位图使用的资源将自动清理。 直接将Png写入不可搜索的流的问题是,它可能导致GDI +中发生一般错误 ,当我在Azure上尝试我的Asp应用程序时发生这种情况。 这就是我的代码现在的样子: using (MemoryStream ms = new MemoryStream()) { bitmap.Save(ms, ImageFormat.Png); ms.WriteTo(stream); } 现在除非我之后使用bitmap.Dispose(),否则会泄漏。 重新提出问题以获得更具体的答案: 为什么这种位图内存的泄漏似乎取决于我将其保存到哪种类型的流? 更新:正如我在评论中被问到我是否确定它是一个泄漏。 在压力测试中反复调用上面的内容,我的w3wp进程将进入gig和gig的内存使用,直到我的机器开始交换,它将无法清理。

将位图转换为图标

我正在尝试将图像从Bitmap转换为Windows图标。 这是代码。 private void btnCnvrtSave_Click(object sender, EventArgs e) { Bitmap bmp = (Bitmap)picturePanel.BackgroundImage; Bitmap newBmp = new Bitmap(bmp); Bitmap targetBmp = newBmp.Clone(new Rectangle(0, 0, newBmp.Width, newBmp.Height), PixelFormat.Format64bppArgb); IntPtr Hicon = targetBmp.GetHicon(); Icon myIcon = Icon.FromHandle(Hicon); SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = “Save Icon”; sfd.Filter = “Icon|*.ico”; sfd.ShowDialog(); FileStream fileStream = new FileStream(sfd.FileName,FileMode.OpenOrCreate); myIcon.Save(fileStream); fileStream.Flush(); […]

将滤镜应用于Bitmap对象

我找到了关于如何将颜色filter应用于C#中的Bitmap对象的代码 。 它的问题是它使用不安全的代码来实现这一目标。 是否有管理,安全的方式来做同样的事情? 我知道我可以使用像AForge.NET这样的库或类似的东西,但我希望有一种简单的方法来应用滤色器。 我只需要简单的颜色替换,用黄色代替白色像素。 有什么建议?

自动将位图修剪为最小尺寸?

假设我有一个32bpp ARGB模式的System.Drawing.Bitmap 。 这是一个很大的位图,但它主要是完全透明的像素,中间某处有一个相对较小的图像。 检测“真实”图像边界的快速算法是什么,所以我可以裁掉周围的所有透明像素? 或者,我可以使用.Net中的function吗?

将图形对象转换为位图对象

如何使用C#将图形对象转换为位图对象?

位图中的颜色百分比

在不知道位图的情况下开始 ** To get total pixels in bitmap height*Width To get total white pixels Where R==255 & B==255 & G==255 To get total black pixels Where R==0 & B==0 & G==0 To get total grey pixels where R=G=B 其余的将是混合色,应该给我。 显然程序会运行数千次,所以我需要使用Lockbits。 目前的问题是不准确的结果。 请建议。 尝试使用aforge.net或imagemagick.net库来检查它是否可以给出准确的结果 如何在位图中找到颜色像素百分比,最初位图对象来自PDF页面。 我尝试使用bitmap.getpixel()它需要很长时间,LockBits性能更好,想知道使用Lockbits查找不包括黑色,白色和灰色的彩色像素百分比。 这是为了识别PDF文件中的彩色页面和打印特定页面的颜色用法。 我刚刚有一个代码来检测黑白像素的数量,我只是试图利用这段代码来检测百分比只是通过找到总像素然后差异应该给我颜色像素,不确定它是否正确接近与否! public void ColourPercentage(Bitmap page, ref int nBlackCount, ref […]

现有图形到位图

我正在为一个交易软件(C#,winforms,.NET 3.5)编写一个插件,我想在一个面板(比如ChartPanel )上绘制一个十字光标,其中包含可能很昂贵的数据。 到目前为止我所做的是: 我在面板中添加了一个CursorControl 此CursorControl位于主绘图面板上方,以便覆盖整个区域 它的Enabled = false以便将所有输入事件传递给父ChartPanel 实现了Paint方法,以便在当前鼠标位置从上到下和从左到右绘制线条 当MouseMove事件被触发时,我有两种可能性: A)调用ChartPanel.Invalidate() ,但正如我所说,底层数据绘制可能很昂贵,这会导致每次移动鼠标时都重绘一次,这是错误的(但这是我可以做到这一点的唯一方法)现在) B)调用CursorControl.Invalidate()并在绘制光标之前,我将获取当前绘制数据的快照,并将其保留为光标的背景,每次光标需要重新绘制时,光标将被恢复…这是…… 我不知道该怎么做 。 2.B. 意思是: 将现有的Graphics对象转换为Bitmap (它(Graphics)是通过Paint方法给我的,我必须在它上面绘制,所以我不能创建一个新的Graphics对象……也许我弄错了,但那就是我理解的方式) 在绘制十字准线之前,从位图恢复图形内容并重新绘制十字准线 我无法控制绘制昂贵数据的过程。 我可以访问我的CursorControl及其通过API调用的方法。 那么有没有办法将现有的图形内容存储到Bitmap中并在以后恢复? 或者有没有更好的方法来解决这个问题? 决议:经过几个小时的反复试验,我想出了一个有效的解决方案。 我使用的软件存在许多问题,一般无法讨论,但主要原则很明确: 已经绘制的东西的现有图形不能直接转换为Bitmap,而是我必须使用@ Gusman的答案中首次提到的panel.DrawToBitmap方法。 我知道它,我想避免它,但最后我不得不接受,因为它似乎是唯一的方式 我也希望避免每一帧的双重绘制,因此第一个十字准线颜色总是直接绘制到ChartPanel 。 在鼠标移动而不更改图表图像后,我通过DrawToBitmap进行DrawToBitmap ,并按照所选答案中的描述继续操作。 控件必须是不透明的(未启用透明背景),以便刷新它不会在它的父控件上调用Paint(这会导致整个图表重绘) 我每隔几秒左右仍会偶尔出现闪烁现象,但我想我能以某种方式解决这个问题。 虽然我选择了Gusman的答案,但我要感谢所有参与者,因为我使用了其他答案中提到的许多其他技巧,比如Panel.BackgroundImage,使用Plot()方法代替Paint()来锁定图像等。

如何创建Bitmap深层副本

我在我的应用程序中处理Bitmaps,出于某些目的,我需要创建Bitmap的深层副本。 有一种优雅的方式怎么做? 我试过了 Bitmap deepCopy = original.Clone(); ,显然这不是创造一个深刻的副本,而是浅薄的副本。 我的下一个尝试是创建一个新的位图 Bitmap deepCopy = new Bitmap(original); 不幸的是,这个构造函数是Bitmap(Image),而不是Bitmap(Bitmap),而Bitmap(Image)会将我漂亮的8bppIndexed Pixelformat转换为另一个。 另一种尝试是使用MemoryStream public static Bitmap CreateBitmapDeepCopy(Bitmap source) { Bitmap result; using (MemoryStream stream = new MemoryStream()) { source.Save(stream, ImageFormat.Bmp); stream.Seek(0, SeekOrigin.Begin); result = new Bitmap(stream); } return result; } 好吧,这也不起作用,因为必须在Bitmap的整个生命周期内打开MemoryStream。 所以,我总结了所有的后果,我真的很想看到一个很好的方法来创建一个Bitmap深层副本。 感谢那 :)

无法在位图中设置调色板

我一直在写一个PCX解码器,到目前为止,PCX图像本身解析得很好,但我无法弄清楚如何设置位图的调色板。 我创建了一个像这样的位图: Bitmap bmp = new Bitmap(width, height, stride2, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, pixels); 但我似乎无法使用以下方法设置调色板: for (int i = 0; i < 256; i += 3) { Color b = new Color(); b = Color.FromArgb(palette[i], palette[i + 1], palette[i + 2]); bmp.Palette.Entries.SetValue(b, i); } 在这个例子中,我已经读完了pcx文件调色板中的每个字节并将它们存储在palette []中。 从那里,我用它来设置位图调色板中的条目。 如何设置颜色?

生成16位灰度BitmapData并保存到文件

我试图从随机数据中生成C#中的16位灰度位图。但是它在Marshal.Copy上崩溃了。 这是我的代码: Bitmap b16bpp; private void GenerateDummy16bitImage() { b16bpp = new Bitmap(IMAGE_WIDTH, IMAGE_HEIGHT, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale); var rect = new Rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT); var bitmapData = b16bpp.LockBits(rect, ImageLockMode.WriteOnly, b16bpp.PixelFormat); // Calculate the number of bytes required and allocate them. var numberOfBytes = bitmapData.Stride * IMAGE_HEIGHT * 2; var bitmapBytes = new short[numberOfBytes]; // Fill the bitmap […]