在 WPF 中创建复合位图图像

2024-05-02

我有三个位图图像,我想将它们拼接在一起以创建合成图像。要拼接在一起的三个图像按以下方式对齐:

这些图像的类型为 System.Windows.Media.Imaging.BitmapImage。我看过以下内容solution https://stackoverflow.com/questions/14661919/merge-png-images-into-single-image-in-wpf,但它使用 System.Drawing.Graphics 来执行拼接。我发现每次我想将 BitmapImage 拼接在一起时将它们转换为 System.Drawing.Bitmap 是不直观的。

有没有一种简单的方法将 System.Windows.Media.Imaging.BitmapImage 类型的三个图像拼接在一起?


除了其他答案中描述的选项之外,下面的代码将三个 BitmapSource 拼接成一个 WriteableBitmap:

public BitmapSource StitchBitmaps(BitmapSource b1, BitmapSource b2, BitmapSource b3)
{
    if (b1.Format != b2.Format || b1.Format != b3.Format)
    {
        throw new ArgumentException("All input bitmaps must have the same pixel format");
    }

    var width = Math.Max(b1.PixelWidth, b2.PixelWidth + b3.PixelWidth);
    var height = b1.PixelHeight + Math.Max(b2.PixelHeight, b3.PixelHeight);
    var wb = new WriteableBitmap(width, height, 96, 96, b1.Format, null);
    var stride1 = (b1.PixelWidth * b1.Format.BitsPerPixel + 7) / 8;
    var stride2 = (b2.PixelWidth * b2.Format.BitsPerPixel + 7) / 8;
    var stride3 = (b3.PixelWidth * b3.Format.BitsPerPixel + 7) / 8;
    var size = b1.PixelHeight * stride1;
    size = Math.Max(size, b2.PixelHeight * stride2);
    size = Math.Max(size, b3.PixelHeight * stride3);

    var buffer = new byte[size];
    b1.CopyPixels(buffer, stride1, 0);
    wb.WritePixels(
        new Int32Rect(0, 0, b1.PixelWidth, b1.PixelHeight),
        buffer, stride1, 0);

    b2.CopyPixels(buffer, stride2, 0);
    wb.WritePixels(
        new Int32Rect(0, b1.PixelHeight, b2.PixelWidth, b2.PixelHeight),
        buffer, stride2, 0);

    b3.CopyPixels(buffer, stride3, 0);
    wb.WritePixels(
        new Int32Rect(b2.PixelWidth, b1.PixelHeight, b3.PixelWidth, b3.PixelHeight),
        buffer, stride3, 0);

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

在 WPF 中创建复合位图图像 的相关文章

随机推荐

  • 绝对位置在固定位置内不起作用

    div div div div Both main and inner集装箱取走position fixed 内胆的制作方法position absolute和主容器position fixed 你需要定义top right bottom
  • Javafx-场景快照不显示值和系列

    我制作了一个非常短的应用程序 它使用 javafx 生成图表 应用程序显示正确的值 图表 但当我做快照时 图像仅显示轴和标签 但不显示系列和值 stage setTitle Line Chart Sample final DateAxis
  • 使用 chrome canary 执行 selenium python 脚本时如何抑制控制台错误/警告/信息消息

    我正在使用 Chrome Canary 运行 python 脚本 下面的完整脚本链接 进行硒测试 测试似乎运行良好 但是 控制台上显示了大量错误 警告 信息消息 有没有办法抑制这些消息 我努力了 chrome options add arg
  • ToggleButton 控件 VisualStateManager:处理多个悬停状态

    参考我之前的问题 Silverlight MVVM 困惑 基于状态更新图像 https stackoverflow com questions 5034189 silverlight mvvm confusion updating imag
  • 带有“null”PendingIntent 的通知

    我正在尝试在 Android 中实现通知 现在我有一个问题 我不想再有一个PendingIntent该用户将打开任何Activity 我怎样才能做到这一点 PendingIntent contentIntent PendingIntent
  • 对于范围从 0 到最大值的 uint64_t 键,最佳哈希函数是什么?

    假设我们有一组元素并希望将它们存储在哈希映射中 例如std unordered set 并且每个元素都有一个 type 的键uint64 t其值可以从 0 到最大可能值变化 使用简单哈希函数 其中键的哈希值就是键本身 是最佳选择吗 它是否取
  • 可能的数独谜题的数量[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Wiki http en wikipedia org wiki Mathematics of Sudoku http en wikiped
  • 将 python scikit learn 模型导出到 pmml

    我想将 python scikit learn 模型导出到 PMML 中 什么 python 包最适合 我读到Augustus https github com opendatagroup augustus 但我找不到任何使用 scikit
  • 使用 $location 重定向到 AngularJS 中的新页面

    我正在使用以下 AngularJS location 进行测试 我不明白这有什么问题 只是想检查重定向是否有效 HTML Hello name
  • 求分数 a/b 的小数点后第 k 位,其中 a、b、k 是非常大的整数(小于 10e18)

    我的任务是找到分数 a b 小数点后第 k 位的数字 昨天我发现了这个算法 为了获取小数点后的任何数字 我生成一个名为 rem 的变量并进行循环 for int i 1 i lt k 1 i rem a b a rem 10 cout lt
  • 如何使用 OpenGL ES 2.0 旋转对象?

    在 OpenGL ES 1 1 中 您可以使用glRotatef 旋转模型 但 OpenGL ES 2 0 中不存在该函数 那么 在OpenGL ES 2 0中如何进行旋转呢 为了遵循克里斯蒂安所说的 您需要自己跟踪模型视图矩阵并操纵它来执
  • 如何在Vite配置中更改antd主题?

    是一个由Vite和React antd组成的项目 我想在 vite config ts 中动态处理 antd 主题 如果您能告诉我如何修改 React 组件中的 less modifyVars 值 我将不胜感激 这是当前屏幕 光状态 htt
  • Amazon DynamoDB 使用无服务器修改结构

    修改 DynamoDB 表结构的最佳方法是什么 由于备份而删除它没有问题 我有一个只有哈希键的表 我必须为表添加一个排序键 当我部署堆栈时 我收到此错误 错误 CloudFormation 模板无效 模板格式错误 模板的资源块中存在未解析的
  • MySQL存储过程错误意外字符“:”

    我有以下语句来创建存储过程 但我不断收到 位置 835 处出现意外字符 错误 语句中唯一的冒号位于 start loop 循环中 为什么我会收到此错误以及如何修复 DELIMITER CREATE DEFINER root localhos
  • 批处理文件中的 Powershell - 如何转义元字符?

    运行 Windows 7 当我复制文件在例程期间到外部磁盘文件备份 我使用 Powershell v2 从批处理文件 在副本文件上重新创建原始文件的所有时间戳 以下代码在大多数情况下都能成功运行 但并非总是如此 SET file 1 SET
  • Laravel Eloquent - 附加与同步

    有什么区别attach and sync 在 Laravel 4 的 Eloquent ORM 中 我试图环顾四周 但什么也没找到 附 处理多对多关系时插入相关模型 不需要数组参数 Example user User find 1 user
  • 如何在java中使用模式匹配器?

    假设字符串是我想提取xyz从字符串中出来 我用了 Pattern titlePattern Pattern compile lttitle gt s s lt title gt Matcher titleMatcher titlePatte
  • 从 s3 静态网站中的按钮触发 lambda

    我有一个静态网站 其中有一个包含几个字段的表单 CloudFront 位于将流量路由到站点的存储桶的前面 所涉及的表单自然有一个 POST 到 的按钮 有没有办法让按钮上的点击触发带有表单字段内容的 lambda 函数 提前致谢 API G
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • 在 WPF 中创建复合位图图像

    我有三个位图图像 我想将它们拼接在一起以创建合成图像 要拼接在一起的三个图像按以下方式对齐 这些图像的类型为 System Windows Media Imaging BitmapImage 我看过以下内容solution https st