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

时间:2011-12-10 18:04:50

标签: c# winforms gdi+

我想将图片设置为具有透明背景,但我不想用透明度替换特定颜色的所有像素。

更具体地说,图像是文件夹的缩略图,通过IShellItemImageFactory.GetImage获得。这给了我一个位图,如Windows资源管理器缩略图视图中所示,但背景为纯白色。

我可以在其上使用Bitmap.MakeTransparent,这在大多数情况下都有效,但在任何情况下缩略图图像都包含白色(例如,包含图像的文件夹,包括白色)。

很明显,这是作为开发人员十多年来第一次在谷歌搜索我的问题后,我没有在任何地方找到答案,而且我实际上不得不自己问一下。 (我认为这意味着我只是升级了!Yippee,我现在是二级开发人员......)

2 个答案:

答案 0 :(得分:1)

使用泛光填充算法根据需要从OUTSIDE填充相同颜色的像素。它与photoshop中的魔杖相似。

http://en.wikipedia.org/wiki/Flood_fill

我要做的是用一些不起眼的颜色填充(Magenta总是为我做),然后用透明替换那个颜色(我不知道填充透明像素是否可行)。

答案 1 :(得分:1)

那么你从IShellItemImageFactory.GetImage获得的是一张合成图像,其中包含白色背景上的原始图像?我怀疑如果图像与缩略图大小的宽高比​​不同,则会出现白色背景。例如,如果您要求640x480图像的96x96缩略图,则顶部和底部会有一些空白区域。

如果是这种情况,则表示您遇到了问题。您无法区分图像中包含的白色像素和GetImage添加的白色像素。

你可以做一些事情。您可以加载图像并自己调整大小。这可能是最简单的。您希望保留自己的缩略图缓存。

或者您可以检查GetImage返回的图像以查找侧面的空白区域。基本上,如果行(或列)上的每个像素都是白色,则使该行(或列)透明。它比那更复杂(例如the NBA logo)。但这基本上就是你想做的事情。