C# 位图对象,颜色显示为透明

标签 c# image graphics bitmap pixelformat

我正在使用 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/

相关文章:

c# - 无法从 Azure 函数中的 Blob 存储读取文件

c# - 将 null 分配给可为空的 int 时出错 - "The value ' null' 对属性无效”

image - 客户想要网站上的 "uncopyable images"

css - 100% 下载后的图像显示

r - 如何使用 ggplot2 为曲线下的区域着色

c++ - 我如何使用中点圆算法去除在 SDL 中绘制的圆中的这些间隙?

math - 向量矩阵乘法顺序会影响性能吗?

c# - 如何在 C# 中编写 XML?

c# - 使用 UpdatePanel 删除行后更新/刷新 Gridview。 ASP.NET C# AJAX

css - 等待图像加载后再显示