如何使用透明度支持Control.DrawToBitmap?

时间:2014-02-10 13:16:09

标签: c# .net vb.net bitmap controls

目前我正在使用Control DrawToBitmap方法捕获我的WebBrowser,如下所示。

var bmp = new  Bitmap(640,480, PixelFormat::Format32bppArgb)
var web = (System.Windows.Forms.Control)sender;
web.DrawToBitmap(bmp, Rectangle(0, 0, 640,480));

我的Bitmap支持Alpha频道,但此代码不会保存透明度。

以下是网页示例: http://jsfiddle.net/zPtPN/

1 个答案:

答案 0 :(得分:1)

编辑2:嵌入式浏览器的不透明度

使用CEF(来自Google的Chromium Embedded Framework),您应该执行以下操作。这可能适用于或不适用于默认的.NET Internet Explorer控件。

body
{
    background-color: transparent;
}

要覆盖它,您必须渲染到已清除的缓冲区。缓冲区不是最终渲染的栅格,而是一个中间内存缓冲区,它保留了非常多的alpha通道。只要清除缓冲区(用透明像素填充),就可以使用完整的ARGB32通道获取缓冲区并正确覆盖它,你应该得到你想要的。

最好的是,您尽可能地尝试,然后截取屏幕截图并发布一个新问题,指明您使用的是嵌入式浏览器。同时指定浏览器版本,因为它将从一台计算机更改为另一台计算机:Options for embedding Chromium instead of IE WebBrowser control with WPF/C#


Bitmap可能包含Alpha通道信息,但并非所有文件格式都支持它。您应将图像保存为*.PNG ARGB32无损模式。一个简单的*.BMP文件是不够的。

看看这个答案,不仅知道如何保存为PNG,还知道如何实现透明度:

c# Bitmap.Save transparancy doesn't save in png

要从网页获取透明度,您可以尝试使用 UGLY CUMBERSOME HORRIBLE 技术,这些技术存在大量问题:

  

为身体背景使用独特的颜色,例如#ffe000。渲染页面,像以前一样抓住它。

透明部分将显示身体的背景。

此时,您可以通过将TransparencyKey设置为背景颜色 -OR - 过滤图像,方法是用完全透明的像素替换该颜色的所有像素颜色(只需将Alpha通道的值从255更改为0)。

为什么这太可怕了?因为结果会很难看:

  • 字体被平滑并且会有这种颜色的阴影,所以你不能让它们部分透明,它们会保持不透明度并且看起来很可怕,就像在ol'90中看到的GIF一样(它们被称为渲染工件)。 / LI>
  • 如果你使用像border-radiusbox-shadow这样漂亮的CSS3内容,会出现与上面相同的瑕疵:带阴影的边框像素(抗锯齿)看起来很糟糕。

丑陋的Example here

那你怎么能删除这些文物呢?你不能。 我强烈建议您采用完全不同的方法解决问题。

顺便问一下,你想要达到什么目的?您是否正在使用CEF或其他嵌入式浏览器技术以某种方式覆盖? 也许还有其他方法可以帮助你......

编辑:为什么ffff <div>没有显示

您将样式设置为:

background-color: transparent;  opacity:0;

现在,<div>的背景将是透明的,并显示背后的内容(<body>的{​​{1}})。当您设置background-color时,您会说整个opacity(包含的图片和文字)都是透明的。将其设置为<div>意味着完全不可见。