我的任务是捕获图像,将其复制到剪贴板,然后将其粘贴到下面的应用程序中。我必须能够支持几乎任何富文本字段,必须保持透明度。我目前的解决方案首先呈现白色背景。这是我的代码:
RenderTargetBitmap包含我希望复制为.PNG的图像
public static void CopyImageToClipboard(RenderTargetBitmap b)
{
MemoryStream stream = new MemoryStream();
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(b));
encoder.Save(stream);
Bitmap bmp = new Bitmap(stream);
Bitmap blank = new Bitmap(Convert.ToInt32(b.Width), Convert.ToInt32(b.Height));
Graphics g = Graphics.FromImage(blank);
g.Clear(System.Drawing.Color.White);
System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
g.DrawImage(img, 0, 0, Convert.ToInt32(b.Width), Convert.ToInt32(b.Height));
Bitmap tempImage = new Bitmap(blank);
blank.Dispose();
img.Dispose();
bmp = new Bitmap(tempImage);
tempImage.Dispose();
System.Windows.Forms.Clipboard.SetImage(bmp);
stream.Dispose();
}
答案 0 :(得分:3)
只需选择随机颜色即可将其用作背景,让我们说
var background = Color.FromArgb(1, 255, 1, 255);
删除背景:
g.Clear(background); // instead of System.Drawing.Color.White
然后使颜色透明:
Bitmap tempImage = new Bitmap(blank);
tempImage.MakeTransparent(background);
请注意,默认透明色也很好用,不需要选择魔术色(检查是否需要Clear()
背景,它可能是 - 我没有检查 - 默认位图背景):
g.Clear(Color.Transparent);
// ...
tempImage.MakeTransparent();
编辑某些较旧的RTF控制版本无法处理透明度,您无法为此做任何事情(AFAIK)。一个不错的解决方法(如果您无法检测粘贴目标的控件类并读取其背景颜色)是使用Color.FromArgb(254, 255, 255, 255)
。白色,不支持透明度,......完全透明(因为MakeTransparent()
)所在的位置。
答案 1 :(得分:0)
默认情况下,Windows剪贴板不支持透明度,但您可以将多种类型的内容放在剪贴板上,以确保大多数应用程序在其中找到可以使用的某些类型。通常,除了正常的非透明剪贴板位图格式之外,如果您将图像以PNG和DIB格式放在剪贴板上,大多数应用程序将能够使用其中至少一个以其支持的格式获取图像。透明。
但是,这些格式以特定方式放在剪贴板上。他们需要将他们的数据(对于png,不是加载的图像对象,而实际的png 文件的字节)放在{{ 1}}然后放在剪贴板上。
PNG放在剪贴板上会被许多应用程序接受,包括Gimp和较新的MS Office。当然,如果您也实现了阅读,您可以在自己的应用程序中使用它。如果它们确实支持透明图像粘贴,那么(相当脏的)DIB格式应该处理大多数其他应用程序。
我详细介绍了如何在这个答案中进行复制和检索: