当前位置: 首页 > news >正文

C# 将多个Image 合成为一个,格式可选择

在一些场景中,需要把多个图片,合(拼)成为一张 ,合成效果示例:

纵向:



横向:



代码实现:


 enum ImageMergeOrientation
    {
        Horizontal,
        Vertical
    }


private void CombineImages(FileInfo[] files, string toPath, ImageMergeOrientation mergeType = ImageMergeOrientation.Vertical)
        {
            //change the location to store the final image.
            var finalImage = toPath;
            var imgs = files.Select(f => Image.FromFile(f.FullName));

            var finalWidth = mergeType == ImageMergeOrientation.Horizontal ?
                imgs.Sum(img => img.Width) :
                imgs.Max(img => img.Width);

            var finalHeight = mergeType == ImageMergeOrientation.Vertical ?
                imgs.Sum(img => img.Height) :
                imgs.Max(img => img.Height);

            var finalImg = new Bitmap(finalWidth, finalHeight);
            Graphics g = Graphics.FromImage(finalImg);
            g.Clear(SystemColors.AppWorkspace);

            var width = finalWidth;
            var height = finalHeight;
            var nIndex = 0;
            foreach (FileInfo file in files)
            {
                Image img = Image.FromFile(file.FullName);
                if (nIndex == 0)
                {
                    g.DrawImage(img, new Point(0, 0));
                    nIndex++;
                    width = img.Width;
                    height = img.Height;
                }
                else
                {
                    switch (mergeType)
                    {
                        case ImageMergeOrientation.Horizontal:
                            g.DrawImage(img, new Point(width, 0));
                            width += img.Width;
                            break;
                        case ImageMergeOrientation.Vertical:
                            g.DrawImage(img, new Point(0, height));
                            height += img.Height;
                            break;
                        default:
                            throw new ArgumentOutOfRangeException("mergeType");
                    }
                }
                img.Dispose();
            }
            g.Dispose();
            finalImg.Save(finalImage, System.Drawing.Imaging.ImageFormat.Tiff);
            finalImg.Dispose();
        }

代码说明:

根据参数进行横向或纵向合并图片

如果为横向,图片高度为最高的那张;如果纵向则宽度为最宽的那张




UT 代码:

[TestMethod]
        public void Combine_Multiple_SampleImages_IntoOne()
        {
            const string folderPath = "C:\\Users\\Public\\Pictures\\Sample Pictures";
            var images = new DirectoryInfo(folderPath).GetFiles("*.jpg", SearchOption.TopDirectoryOnly);

            CombineImages(images, "C:/FinalImage_H.tiff");
            CombineImages(images, "C:/FinalImage_V.tiff", ImageMergeOrientation.Vertical);
        }



相关文章:

  • IE8 正式版(RTM) 的版本号: 8.0.6001.18702
  • Iori的工具箱 之 C# 实现多个图片合为一个Tiff
  • Asp.Net MVC4 系列--进阶篇之View
  • Xp+Windows 7硬盘安装 体验心得
  • Javascript 实现的StopWatch
  • Asp.Net MVC4系列--进阶篇之Helper(1)
  • 玻璃效果
  • Asp.Net MVC4 系列--进阶篇之Helper(2)
  • 主流杀毒软件多已支持windows7
  • IE 异常_doPostBack is undefined
  • 推荐一款很经典的网络电话——阿里通网络电话
  • Asp.Net MVC4系列--进阶篇之AJAX
  • Asp.Net MVC4 系列--进阶篇之Model(1)
  • Windows 7安装过程全体验!(42图)
  • Asp.Net MVC4 系列--进阶篇之Model(2)
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【面试系列】之二:关于js原型
  • angular学习第一篇-----环境搭建
  • Flex布局到底解决了什么问题
  • HTTP中GET与POST的区别 99%的错误认识
  • js数组之filter
  • maven工程打包jar以及java jar命令的classpath使用
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • windows下使用nginx调试简介
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 订阅Forge Viewer所有的事件
  • ------- 计算机网络基础
  • 近期前端发展计划
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 数组的操作
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • # 数据结构
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • %@ page import=%的用法
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (三)c52学习之旅-点亮LED灯
  • (算法)前K大的和
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .Net Redis的秒杀Dome和异步执行
  • .net 流——流的类型体系简单介绍
  • .net 微服务 服务保护 自动重试 Polly
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中GET与SET的用法
  • @JoinTable会自动删除关联表的数据
  • @ModelAttribute注解使用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成