1. 利用DrawingVisual实现绘制拼接
2. 将DrawingVisual转为RenderTargetBitmap
3. 最后再通过复制像素转为WriteableBitmap

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;namespace WpfApp17
{class numberctrl:Decorator{int iComboCount = 0;                      //连击数字int iNumImgCount  = 0;                    //图像数量int iComboFrameIndex = 0;                 //当前播放帧数const int kComboFrameCount = 40;          //需要播放的总帧数WriteableBitmap numComboBitmap = null;    //拼接后的图像System.Timers.Timer timer = new System.Timers.Timer();public numberctrl(){timer.Interval = 60;timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimer);timer.AutoReset = true;timer.Enabled = false;}// 随着计时器迭代加帧数,重新绘制private void OnTimer(object source, System.Timers.ElapsedEventArgs e){System.Windows.Application.Current.Dispatcher.Invoke(() =>{iComboFrameIndex++;InvalidateVisual();if (iComboFrameIndex >= kComboFrameCount){if (timer.Enabled){timer.Stop();}}});}// 外界通过该接口实现触发更新public void UpdateCombo(int iNewComboCount){iComboCount = iNewComboCount;if (iComboCount == 0){if (timer.Enabled){timer.Stop();}InvalidateVisual();}else{if (!timer.Enabled){timer.Start();}}}// 重写Decorator渲染函数protected override void OnRender(DrawingContext dc){base.OnRender(dc);if (iComboCount > 0){DoCartoon(dc);}}// 获取图片public BitmapImage GetBitmapCacheByNum(int num){try{BitmapImage bmp;num = num > 9 ? 9 : num;num = num < 0 ? 0 : num;string filePath = $"pack://application:,,,/WpfApp17;Component/Resources/{num}.png";bmp = new BitmapImage(new Uri(filePath));bmp.Freeze();return bmp;}catch { }return null;}// 将拼接好的图像进行渲染private void DoCartoon(DrawingContext dc){//获取图片列表if (numComboBitmap == null){List<BitmapImage> numBitmpList = new List<BitmapImage>();if (iComboCount >= 100){if (iComboCount > 999)iComboCount = 999;numBitmpList.Add(GetBitmapCacheByNum(iComboCount / 100));numBitmpList.Add(GetBitmapCacheByNum((iComboCount % 100) / 10));numBitmpList.Add(GetBitmapCacheByNum(iComboCount % 10));}else if (iComboCount >= 10){numBitmpList.Add(GetBitmapCacheByNum(iComboCount / 10));numBitmpList.Add(GetBitmapCacheByNum(iComboCount % 10));}else{numBitmpList.Add(GetBitmapCacheByNum(iComboCount % 10));}//拼接图片为单个numComboBitmap = CreateNumberBitmap(numBitmpList);iNumImgCount = numBitmpList.Count;}// 画位图Rect combRect = getDrawRectByCombo(20, 20, iNumImgCount, iComboFrameIndex);dc.DrawImage(numComboBitmap, combRect);}// list<BitmapImage> -> WriteableBitmapprivate WriteableBitmap CreateNumberBitmap(List<BitmapImage> numBitmpList){if (numBitmpList.Count == 0)return null;WriteableBitmap bitmpCache = null;try{Rect bitmapRect = new Rect(0, 0, numBitmpList.ElementAt(0).Width * numBitmpList.Count, numBitmpList.ElementAt(0).Height);bitmpCache = new WriteableBitmap((int)bitmapRect.Width, (int)bitmapRect.Height, 96, 96, PixelFormats.Pbgra32, null);byte[] pixels = new byte[(int)bitmapRect.Width * (int)bitmapRect.Height * 4];// images -> drawingvisualDrawingVisual drawingVisual = new DrawingVisual();{DrawingContext dc = drawingVisual.RenderOpen();double point = 0;for (int i = 0; i < numBitmpList.Count; i++){Rect drawRect = new Rect(point, 0, numBitmpList.ElementAt(i).Width, numBitmpList.ElementAt(i).Height);dc.DrawImage(numBitmpList.ElementAt(i), drawRect);int iOffX = 2;if (i > 0){iOffX = 5;}point += numBitmpList.ElementAt(i).Width - iOffX;}dc.Close();dc = null;}// drawingvisual -> rendertargetbitmapRenderTargetBitmap r = new RenderTargetBitmap((int)bitmapRect.Width, (int)bitmapRect.Height, 96, 96, PixelFormats.Pbgra32);r.Render(drawingVisual);int stride = (r.PixelWidth * r.Format.BitsPerPixel + 7) / 8;r.CopyPixels(pixels, stride, 0);r.Freeze();// rendertargetbitmap -> WriteableBitmapbitmpCache.Lock();Int32Rect rect = new Int32Rect(0, 0, (int)bitmapRect.Width, (int)bitmapRect.Height);bitmpCache.WritePixels(rect, pixels, stride, 0);bitmpCache.AddDirtyRect(rect);bitmpCache.Unlock();}catch (Exception e1){}return bitmpCache;}// 根据帧索引确定绘制区域private Rect getDrawRectByCombo(int x, int y, int count, int iFrame){// 确认每帧更改宽度const double dMaxWidth = 35;const double dMinWdith = 22;double changeSpan = (dMaxWidth - dMinWdith) / kComboFrameCount;// 帧数范围防御double iIndex = (double)iFrame;iIndex = iIndex > kComboFrameCount ? kComboFrameCount : iIndex;iIndex = iIndex < 0 ? 0 : iIndex;// 最大宽度与高度double sourceWidth = dMaxWidth;double sourceHeight = sourceWidth * 38 / 29;// 当前帧数的宽度与高度double desWidth = sourceWidth - changeSpan * iIndex;double desHeight = desWidth * 38 / 29;double offx = (sourceWidth - desWidth) / 2;double offy = (sourceHeight - desHeight) / 2;return new Rect(x + offx, y + offy, desWidth * count, desWidth * 38 / 29);}}
}

WPF——后台代码实现将多张图片拼接成一张相关推荐

  1. 【Opencv】Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图)

    Python+openCV实现全景图拼接(左右两张图片拼接成一张全景图) 全景图拼接 思路 具体步骤 代码与结果 代码 效果测试1 效果测试2 全景图拼接 思路 这个就是简单对左右两张图进行拼接,希望 ...

  2. chatgpt赋能python:Python将两张图片拼接成一张图:让您的图片处理更高效!

    Python将两张图片拼接成一张图:让您的图片处理更高效! 作为一个有着10年Python编程经验的工程师,我发现Python成为了许多项目的主要语言,其中涵盖了很多关于图像处理的应用程序.在本文中, ...

  3. python将两张图片拼接成一张图_python实现两张图片拼接为一张图片并保存

    本文实例为大家分享了python实现两张图片拼接为一张图片并保存的具体代码,供大家参考,具体内容如下 这里主要用Python扩展库pillow中Image对象的paste()方法把两张图片拼接起来 f ...

  4. 用python将多张图片拼接成一张

    将需要拼接的图片路径写在对应的img_path,比如有6张,通过hstack和vstack函数将图片拼接在一起.resize尺寸可以根据具体图片大小更改,拼接后的图片效果如下: 图片1 图片2 图片3 ...

  5. python将两张图片拼接成一张图_Python将两张图片拼接到一起 - 小众知识

    #!/bin/env python2.4 # -*- coding:utf-8 -*- # 图片拼接练习 import PIL.Image as Image import os,sys mw = 30 ...

  6. ImageMagick将多张图片拼接成一张图片_真没想到!照片加文字和照片拼接,微信就能做到,太方便了...

    照片加文字以及照片拼接,用微信就能做到,太方便了 相信大家在端午佳节的时候,都拍摄了很多照片,分享到朋友圈,但是拍摄的图片太多,微信朋友圈只能发9张. 今天就来教大家如何用微信就照片添加文字和拼接长图 ...

  7. C# 实现多张图片合成一张gif

    此实现方式在.net web项目中实现(winform也可用,自己整理下),网上找了几个例子都不行,参考谋篇博文写的代码,刚开始生成不成功,后来发现是路径写的有问题,遂重新整理一份.效果如下图 项目结 ...

  8. 如何将多张图片拼成一张图?

    如何将多张图片拼成一张图?作为一名幼儿园老师,为满足家长内心需要,我们每天都会给宝贝们拍多张不同的照片然后传给家长.但是一张一张的传,不仅耗费时间而且很慢,所以我通常都是把多张照片拼接在一起,然后传给 ...

  9. 如何将几张图片拼成一张长图,多方法详解

    如何将几张图片拼成一张长图?遇到这个问题,我们首先想到是用手机上的工具来进行,比如秀秀就可以实现,但是要注意的是手机软件进行操作的时候很有可能会压缩图片,而且图片上传也是有限制的.限制拼接图片的大小. ...

最新文章

  1. 【Flutter】ExpansionTile 可折叠列表
  2. 启动Tomcat的时候遇到错误
  3. [C#]关于override和new在重写方法时的区别
  4. Linux 系统管理
  5. C++socket编程(八):8.1 UDP讲解,用户数据报协议
  6. 搭建Ooracle RAC 学习环境之---集群软件安装
  7. shell 脚本批量安装perl包
  8. JasperReport 导出PDF不能加载
  9. chromeos java安装_试用额外硬件驱动和完整JAVA支持的ChromeOS
  10. 【多传感器融合定位】【学习汇总】
  11. 什么是 CSS? 为什么使用CSS?CSS的优点有那些?详细介绍
  12. PHP后端接入短信接口为用户发送通知短信
  13. 树莓派mjpg-streamer+内网穿透
  14. arxiv202210 | cTransformer:基于Transformer的De Novo Molecular Design生成模型
  15. Note For Linux By Jes(4)-文件的压缩与打包
  16. 二维超声速流——普朗特-迈耶稀疏波的流场CFD解(附完整代码)
  17. 三维家可以导入别人的方案吗_怎么把su模型导入三维家
  18. joomla模板的应用
  19. windows 上配置 nginx 转发 https
  20. 用c语言处理bmp开运算,c语言解析bmp图片

热门文章

  1. android16进制编辑器,16进制编辑器app
  2. 基于网络爬虫的新闻实时监测分析可视化系统(Java+MySQL+Web+Eclipse)
  3. 密码学应用-身份认证+数字证书
  4. 笔记:A Novel Representation of Parts for Accurate 3D Object Detection and Tracking in Monocular Images
  5. html中一些界面设计
  6. Win10屏幕不自动关闭怎么设置
  7. 算法设计与分析第二章作业
  8. 安卓通过SQLite实现登录注册功能(小白式教程)
  9. Druid连接池耗尽问题排查总结
  10. 全能在线APP一款开源的多功能在线学习考试智慧软件系统