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

如何在不使用Bitmap.MakeTransparent()的情况下,将图像设置为具有C#中的透明背景?,c#,winforms,gdi+,C#,Winforms,Gdi+,我想将图像设置为透明背景,但我不想用透明替换特定颜色的所有像素 更具体地说,该图像是文件夹的缩略图,通过IShellItemImageFactory.GetImage获得。这为我提供了一个位图,显示在Windows资源管理器缩略图视图中,但背景为纯白 我可以在上面使用Bitmap.MakeTransparent,这在大多数情况下都可以,但在缩略图本身包含白色的任何情况下(例如,包含图像的文件夹,其中包含白色) 顺便说一句,这是作为一名开发人员十多年来第一次在谷歌上搜索我的问题后,我在任何地方都找

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

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

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


顺便说一句,这是作为一名开发人员十多年来第一次在谷歌上搜索我的问题后,我在任何地方都找不到答案,事实上我不得不自己去问。(我想这意味着我刚刚升级了!耶,我现在是一名二级开发人员…

使用泛光填充算法从外部填充需要的相同颜色的像素。它类似于photoshop中的魔杖


我会做的是用一些模糊的颜色进行泛光填充(洋红总是为我做),然后用透明的颜色替换该颜色(我不知道用透明像素进行泛光填充是否可行).

那么您从IShellItemImageFactory.GetImage中得到的是一个合成图像,它包含白色背景上的原始图像?如果图像的纵横比与缩略图大小不一样,我怀疑白色背景存在。例如,如果您需要640x480图像的96x96缩略图,则顶部和底部都会有一些空白

如果是这样,你就有问题了。您无法区分图像中包含的白色像素和由
GetImage
添加的白色像素

你可以做几件事。您可以加载图像并自行调整其大小。这可能是最简单的。那么,您需要维护自己的缩略图缓存


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

也许这可以帮助你:你想在哪里显示图像(比如树视图、按钮?但在任何情况下,缩略图本身包含白色是什么意思?我已经编写了一个图像查看器应用程序,并在flowlayoutpanel的用户控件中显示缩略图。当鼠标移动到缩略图上时,我会绘制一个渐变填充的背景(不同的颜色取决于选定的或热跟踪的)。问题是,如果文件夹缩略图图像中某处包含白色,则该部分现在(错误地)是透明的,我的缩略图绘制处理程序将使用渐变绘制该部分图像(正如预期的那样,因为图像“显示”该部分是透明的)。我希望这是清楚的?如果图像的边框上有白色像素,这将失败。例如,看看NBA的标志:这听起来是一个很好的解决方案。如果你的答案是正确的,我会尝试并更新!(据我所见,边界上没有白色像素。如果在罕见的情况下,这不会比位图更糟。无论如何,使透明。)如果图像仅剪切到红色和蓝色区域的边缘,它不会失败,但我认为OP没有这种图像。嗯。。。我希望我能加载图像并自己重新缩放它。那就简单多了!但这是一个文件夹缩略图。i、 e.它由外壳生成。此外,我要求shell提供256-256图像;据我所知,这是保持大小的外壳缩略图。实际上,我想知道传递给GetImage的标志是否正确。相关代码行是:HResult hRes=((IShellItemImageFactory)ppsi).GetImage(新大小(256,256),SIIGBF.SIIGBF_BIGGERSIZEOK | SIIGBF.SIIGBF_RESIZETOFIT,out hbitmap)@Jerome:调用带有颜色参数的
MakeTransparent
重载有帮助吗?我不清楚您是要消除256x256图像中可能的边界,还是要消除(使其透明)自己背景的某些部分。如果您试图消除自己的背景,请将透明部分设置为可怕的部分(如
Color.Lime
),然后调用
MakeTransparent(Color.Lime)
。谢谢,但通过整体填充解决了此问题。但要回答你的问题。。。我试图消除实际shell缩略图位图图像周围的白色边框(或者,如果我对shell图像提取方法的标志参数进行了修改,则消除黑色边框)。因此,即使是接受颜色的MakeTransparent重载也会有同样的问题:它会从图像中消除所有白色像素,在图像中创建透明的“孔”。