将具有 Alpha 通道的图像复制到具有自定义背景颜色的剪贴板?

2023-12-11

Code :

private void Foo(Canvas canvas)
{
    // The content is a bit larger...
    Size size = new Size(canvas.ActualWidth * 1.1, canvas.ActualHeight * 1.2);

    // Create a render bitmap and push the surface to it
    RenderTargetBitmap renderBitmap =
        new RenderTargetBitmap(
        (int)size.Width,
        (int)size.Height,
        96d,
        96d,
        PixelFormats.Pbgra32
    );
    renderBitmap.Render(canvas);

    // Then copy to clipboard
    Clipboard.SetImage(renderBitmap);
}

我需要的 :

将具有透明背景的画布渲染为图像,然后将其复制到剪贴板(很简单?不是真的)

问题 :

粘贴时,我得到一个黑色背景的丑陋图像

解决方案1:

canvas.Background = new SolidColorBrush(Colors.White);

不行。这么厚不行,背景canvas未来不会改变renderBitmap.Render(canvas);

相反,我必须使用计时器,给 WPF 一些时间来更改背景,然后在该计时器的滴答事件中渲染它。它有效,但不幸的是,内容canvas比它的尺寸大......所以白色背景只能覆盖它的一部分,结果仍然丑陋。 (顺便说一句,有人知道为什么需要一些时间来改变背景吗?我认为它应该立即改变)

我做错什么了吗?如何在剪贴板中获取白色背景前透明图像?

更重要的是,我注意到,如果将某些 PNG 图像粘贴到不支持 Alpha 通道的 mspaint.exe 中,其背景会保持白色,但其他一些图像会变成黑色。

有没有类似的东西,比如说,alternative color,如果您粘贴图像的地方不支持 Alpha 通道,则将其用作背景?我们可以定制吗?

现在我渲染了另一个BitmapSource与白色内容,如果有办法将其与渲染位图作为背景,问题解决了,但我不知道如何......

int dWidth = (int)size.Width;
int dHeight = (int)size.Height;
int dStride = dWidth * 4;
byte[] pixels = new byte[dHeight * dStride];
for (int i = 0; i < pixels.Length; i++)
{
    pixels[i] = 0xFF;
}
BitmapSource bg = BitmapSource.Create(
    dWidth,
    dHeight,
    96,
    96,
    PixelFormats.Pbgra32,
    null,
    pixels,
    dStride
);
// Combine bg with renderBitmap

这是我最后的解决方案,希望它可以帮助其他遇到同样问题的人

// Create a render bitmap and push the surface to it
RenderTargetBitmap renderBitmap =
    new RenderTargetBitmap(
    (int)size.Width,
    (int)size.Height,
    96d,
    96d,
    PixelFormats.Pbgra32
);
renderBitmap.Render(surface);

// Create a white background render bitmap
int dWidth = (int)size.Width;
int dHeight = (int)size.Height;
int dStride = dWidth * 4;
byte[] pixels = new byte[dHeight * dStride];
for (int i = 0; i < pixels.Length; i++)
{
    pixels[i] = 0xFF;
}
BitmapSource bg = BitmapSource.Create(
    dWidth,
    dHeight,
    96,
    96,
    PixelFormats.Pbgra32,
    null,
    pixels,
    dStride
);

// Adding those two render bitmap to the same drawing visual
DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();
dc.DrawImage(bg, new Rect(size));
dc.DrawImage(renderBitmap, new Rect(size));
dc.Close();

// Render the result
RenderTargetBitmap resultBitmap =
    new RenderTargetBitmap(
    (int)size.Width,
    (int)size.Height,
    96d,
    96d,
    PixelFormats.Pbgra32
);
resultBitmap.Render(dv);

// Copy it to clipboard
try
{
    Clipboard.SetImage(resultBitmap);
} catch { ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将具有 Alpha 通道的图像复制到具有自定义背景颜色的剪贴板? 的相关文章

  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如果路径包含主目录波浪号,Python 子进程不会执行 ~

    我正在尝试检测错误并从 django 应用程序重新启动服务器 我正在使用以下代码 try do something except print here subprocess call home my username restart sh
  • 在 Heroku Cedar 上为 Rails 中的资源设置自定义标头

    我有一个使用 Rails 4 0 和资产管道的 cedar 应用程序 我想为资产管道中的所有资产设置自定义标头 如何才能做到这一点 一个简单的方法是使用机架插件 如下所示 class RackAssetFilter def initiali
  • 生成的签名 X.509 客户端证书无效(没有指向其 CA 的证书链)

    我使用 Bouncy Castle 生成 X 509 客户端证书 并使用已知的 CA 来签署它们 首先 我从证书存储中读取 CA 证书 生成客户端证书 并使用 CA 对其进行签名 由于以下问题 证书验证失败 无法为受信任的根颁发机构构建证书
  • Android 中的视图翻转器可以有多少个视图?

    我正在 Android 中开发一个应用程序 我想在其中显示大约 170 张图像 但我希望用户可以通过手指向右或向左查看图像 从互联网上搜索后我得到了一个解决方案 因此我在我的应用程序中使用了View Flipper 当图像计数为15时它将起
  • Matlab向矩阵添加额外的列

    我有一个大小为 216 x 3 的矩阵 我希望向该矩阵添加额外的三列 我认为很简单的事情让我发疯 我原以为它会像下面这样 myData myData zeros length myData 1 3 错误消息如下 然而 两个矩阵具有相同的行数
  • 执行与 Oracle 的连接时,“安全包中没有可用的凭据”

    上次 Windows 更新后 执行与 Oracle 数据库的连接的测试启动失败 并出现 AuthenticationException 下面提供了消息和堆栈跟踪
  • 标签之间的正则表达式,除非转义

    我围绕 Pygments 库制作了一个 PHP 包装器 突出显示代码块 用于代码块检测的正则表达式可以在配置文件 json格式 json 值看起来像这样 codeblock regex pygments pygments JSON 解码后应
  • 如何防止R中的科学记数法? [复制]

    这个问题在这里已经有答案了 我的图以 e 表示法的形式显示 y 轴上的值 我应该使用哪个命令来获取数字形式的值 文件中使用的值是数字形式吗 谢谢 要在整个 R 会话中设置科学记数法的使用 您可以使用scipen选项 从文档 options
  • C++ 后台定时器

    include stdafx h include
  • 如果关系不存在则返回节点

    我正在尝试使用 cypher 创建一个查询 它将 查找 厨师可能拥有的缺失成分 我的图表设置如下 ingredient value is part of gt ingredient ingredient 将有一个名称 染料颜色 的键 值 i
  • Symfony2 登录和安全

    有没有办法可以存储用户上次登录的时间 我正在使用 symfony2 安全配置一切正常 我见过这个基于 Symfony 2 的项目的安全性和登录 这是一个类似的问题 但它不符合我的需要 还有其他解决办法吗 您可以创建一个Authenticat
  • C# HttpClient 和 API

    我有一个 Web 应用程序 它使用 HttpClient 类从 API 中提取数据 我有几个问题 HttpClient 是从 API 获取数据的最佳选择吗 我从 APi 获取一个字符串并将其反序列化为一个对象 每次使用时都会创建 HttpC
  • Python 中如何确定范围[重复]

    这个问题在这里已经有答案了 为什么第二个函数中的第一个 print 语句会抛出错误x没有定义 x 5 def function a print x def function b print x x 7 print x 运行第一个函数会得到以
  • ubuntu 16.04 nginx 更改 phpmyadmin url 不起作用

    Ubuntu 16 04 5 LTS Xenial 4 18 8 x86 64 linode117 nginx version nginx 1 10 3 Ubuntu php v7 0 32 0ubuntu0 16 04 1 etc ngi
  • matplotlib 在 IPython 中不使用 matplotlibrc 文件

    我最近从 matplotlib v1 5 3 从 v2 0 0 升级 但通过此更改 matplotlib 在绘制图形时似乎不再使用我编辑的 matplotlibrc 文件 当我打开 matplotlibrc 文件时 我看到我的更改实际上已实
  • Shiny - 使用 for 循环插入 UI 在每个输出中返回相同的元素

    我想在我的 Shiny 应用程序中插入非预定义数量的图表 我使用了一个for循环和一系列的insertUI 问题是当我运行它时 文本元素的行为符合预期 但图形都呈现相同的图像 我怎样才能防止这种情况发生 这是一个代表 library shi
  • 复制 TreeView 节点

    我正在尝试将选定的树视图节点复制到剪贴板 以便可以将其粘贴到记事本中 这是我的代码 但它不起作用 TreeNode selNode TreeNode this treeView1 SelectedNode Clipboard SetData
  • 尝试使用正则表达式删除Python中的字符EM DASH“—”(—)

    我得到了这个顽固的 EM DASH 字符 我试图使用正则表达式删除它 但由于某种原因我无法让它工作 这是我正在使用的代码 editedSource re sub r u2014 str source 我在这里做错了什么 我很确定我得到了正确
  • 如何表达复数的四分函数

    确实存在所谓的超操作序列 它的工作原理就像你构建乘法一样a b a a a a a并添加了许多a重复b次 然后是求幂a b a a a a a与许多乘法a重复b次 然后 就出现了四联 表示为指数塔 就像a b a a a a 重复b tim
  • 将具有 Alpha 通道的图像复制到具有自定义背景颜色的剪贴板?

    Code private void Foo Canvas canvas The content is a bit larger Size size new Size canvas ActualWidth 1 1 canvas ActualH