2011-12-10 46 views
4

我想设置一个图像有一个透明的背景,但我不想用透明度替换一个特定颜色的所有像素。如何在不使用Bitmap.MakeTransparent()的情况下将图像设置为在C#中具有透明背景?

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

我可以用它Bitmap.MakeTransparent,而且在大多数情况下工作,但在缩略图中包含白色本身的任何情况下(例如,包含图像的文件夹,其中包括白两种颜色)。

顺便说一句,这是超过10年作为一个开发者第一次,谷歌上搜索我的问题后,我还没有找到答案的任何地方,我实际上已经不得不问我自己。 (我想这意味着我只是铲平了!yippee的,我现在是一个2级开发者...)

+0

可能这可以帮助你:http://www.c-sharpcorner.com/UploadFile/mahesh/DrawTransparentImageUsingAB10102005010514AM/DrawTransparentImageUsingAB.aspx –

+0

你想去哪里来显示图像(如,一个TreeView,按钮... )?你是什​​么意思*,但在任何情况下,缩略图图像包含白色*? –

+0

我已经编写了一个图像查看器应用程序,并在我的用户控件的flowlayoutpanel中显示缩略图。当鼠标移过缩略图时,我绘制一个渐变填充背景(不同的颜色取决于所选或热点)。问题是,如果文件夹缩略图图像中包含白色,那么该部分现在(不正确)是透明的,并且我的缩略图绘制处理程序将使用渐变来绘制图像的该部分(如预期的那样,因为图像“说”该部分是透明的)。我希望现在清楚了吗? –

回答

1

使用洪水填充算法从外面填补了相同颜色的像素,因为你需要它。这是类似于Photoshop中的魔杖。

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

我会做的是一些不起眼的颜色(品红色总是这样对我来说)洪水填充,然后替换用透明彩色(我不知道,如果洪水填充与透明像素是可行的)。

+0

如果图像的边界上有白色像素,则会失败。例如,看看NBA徽标:http://upload.wikimedia.org/wikipedia/en/0/07/NBALogo.svg –

+0

这听起来像是一个很好的解决方案。如果你的回答是正确的,我会尝试一下并更新! (有没有白色像素的边界上,据我所看到。而如果在极少数情况下,这将是不差那Bitmap.MakeTransparent反正。) –

+0

如果图像被剪切只是它不会失败红色和蓝色区域的边缘,但我说OP无论如何都没有那种图像。 –

1

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

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

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

或者你可以检查由GetImage返回来寻找对双方的白色空间中的图像。基本上,如果行(或列)上的每个像素都是白色的,那么使该行(或列)透明。这比这更复杂一点(例如,the NBA logo)。但这基本上是你想要做的。

+0

嗯......我希望自己可以加载图像并重新调整它。那会更简单!但这是*文件夹*缩略图。即它由壳产生的。另外,我问壳体256-256的图像;据我所知,缩略图是由shell维护的大小。其实,我想知道我传递给GetImage的标志是否正确。的代码的相关行是:HRESULT HRES =((IShellItemImageFactory)PPSI).GetImage(新SIZE(256,256),SIIGBF.SIIGBF_BIGGERSIZEOK | SIIGBF.SIIGBF_RESIZETOFIT,出HBITMAP); –

+0

@Jerome:这有助于调用带有颜色参数的'MakeTransparent'重载吗?对于我来说,如果您试图消除256x256图像中可能的边框,或者您想要消除(使透明)背景的某些部分,我不清楚。如果你想消除自己的背景,使透明部分丑恶的东西(像'Color.Lime'),然后调用'MakeTransparent(Color.Lime)'。 –

+0

谢谢,但解决与洪水填充。虽然要回答你的问题。我试图消除周围的实际外壳缩略图位图图像的白边(或黑色边框,如果我用标志参数外壳图像提取方法摆弄)。因此,即使是接受颜色的MakeTransparent过载仍然会有同样的问题:它会从图像中消除*全部*白色像素,从而在图像内部创建透明的“洞”。 –

相关问题