【问题标题】:C# Win8: copy .PNG to the Windows clipboard; paste with transparency preservedC# Win8:将.PNG复制到Windows剪贴板;保留透明度的糊状物
【发布时间】:2015-02-14 00:37:51
【问题描述】:

我的任务是捕获图像,将其复制到剪贴板,然后将其粘贴到下面的应用程序中。我必须能够支持几乎任何富文本字段,并且它必须保持透明度。我当前的解决方案首先呈现白色背景。这是我的代码:

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();
 }

【问题讨论】:

  • 问题是?你不想要白色背景?
  • 是的——就像我上面提到的,它必须是透明的。您可能知道,将“透明”位图粘贴到富文本字段会产生灰色背景。
  • g.Clear(System.Drawing.Color.White);那你为什么要这样做?
  • Blorgbeard:“我当前的解决方案首先呈现白色背景。”
  • 我仍然不明白你为什么要这样做,如果你的问题是要有白色背景..

标签: c# png transparency clipboard


【解决方案1】:

只需选择一种随机颜色作为背景,比如说

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())。

【讨论】:

  • 感谢代码 sn-p,但我又回到了灰色背景(通过粘贴在写字板中进行测试)
  • 写字板,它是 old RTF 控件处理透明度的方式。较新的版本(刚刚在 Win 8.1 上测试过)可以正确处理(没有灰色背景)。如果您不知道目标控件(那么您无法读取其背景颜色),您可以使用 FromArgb(254, 255, 255, 255)。白色(如果不支持),在处理的地方是透明的。
  • Adriano Repetti 感谢您提供的信息。我不知道有一种较旧/较新的处理方式。我可能只需要输入代码来处理这些情况。
  • @BPS 不幸的是,您无能为力,并且很难检测目标控件是否能很好地处理它,这就是为什么一个肮脏的解决方法......跨度>
  • 所以,为了清楚起见 - 这段代码:g.Clear(System.Drawing.Color.FromArgb(254, 255, 255, 255));将位图渲染为白色以处理透明显示为灰色的情况,此代码: tempImage.MakeTransparent();实际上会在 Windows 支持的地方渲染位图透明吗?
【解决方案2】:

默认情况下,Windows 剪贴板不支持透明度,但您可以将多种类型的内容放在剪贴板上,以确保大多数应用程序在其中找到可以使用的某种类型。通常,如果除了普通的不透明剪贴板位图格式之外,您将图像以 PNG 和 DIB 格式放在剪贴板上,大多数应用程序将能够使用其中至少一种格式来获取它们支持的格式的图像透明。

不过,这些格式是以特定方式放在剪贴板上的。他们需要将他们的数据(对于 png,不是加载的图像对象,而是实际的 png 文件的字节)放入 MemoryStream 然后放入剪贴板.

像这样放在剪贴板上的PNG 将被众多应用程序接受,包括 Gimp 和较新的 MS Office。当然,如果你也为它实现了阅读,你可以在你自己的应用程序中使用它。 (相当肮脏的)DIB 格式应该可以处理大多数其他应用程序,如果它们确实支持透明图像粘贴的话。

我在这个答案中详细说明了如何进行复制和检索:

https://stackoverflow.com/a/46424800/395685

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多