我正在使用 C# 开发一个程序,该程序可以截取用户屏幕的一部分。最重要的是它可以正常工作,但我最近遇到了一个问题。似乎(至少)有一种像素颜色在输出图像中始终显示为透明。 #0D0B0C(RGB 13、11、12)颜色的任何实例在保存的 png 中显示为透明。这是将 PixelFormat 设置为 Format32bppArgb。如果我将它设置为 Format32bppRgb 或 Format24bppRgb,相同的像素颜色在保存的 png 中显示为黑色。
我不知道是什么原因造成的,但我唯一能够“修复”它的方法是在执行 CopyFromScreen() 之前将图形对象清除为该颜色。尽管出于某些原因,我不愿意这样做。首先,我不知道这是否是唯一有问题的颜色(16,777,216 种颜色有很多可能性),其次,我讨厌 hack 修复,这看起来像是 hack 修复。
任何人都可以阐明可能导致此问题的原因吗?我在创建位图时弄乱了 PixelFormat,在 CopyFromScreen 方法中弄乱了 CopyPixelOperation,似乎没有任何效果。将图形对象清除为该颜色“修复”的事实似乎告诉我透明度来自屏幕数据本身,但这没有意义。我已经盯着这个看太久了,我想我需要一个新的视角来看待它。如果有人知道为什么会发生这种情况,我很想听听。谢谢。
最佳答案
我只需要将 CopyFromScreen 请求到一个根本没有 Alpha channel 的位图中,例如:
Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(bounds.Location, new Point(0, 0), bitmap.Size);
我确认这有 Format32bppArgb 的透明像素孔,但没有 Format32bppRgb
关于C# 位图对象,颜色显示为透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9614091/