C# 将多个图片合并成TIFF文件的两种方法(续集)

01

前言

  为啥名称后面加个续集呢,因为之前有位仁兄写过一篇,我是在他的基础上继续开发和探索的,他那篇文章的链接:

C# 将多个图片合并成TIFF文件的两种方法

然后这位仁兄在文末提了一个遗留问题:

两个方式生成的tif文件大小简直天壤之别。。。

7个原图大小4.8M,第一种1.36M,

第二种直接23.5M…

也可能是我没有弄好压缩方式。。。。

那我就不晓得了。

-----. 这个问题实际上就是因为两种压缩方式和压缩比率不一样导致的.

02

名词解释

首先要弄清楚几个名词:

① 图像的压缩品质:指的就是压缩后的图象清晰度,通俗地讲,就是用图像处理软件保存图像时,为了节省硬盘空间,一般是要对原始图像通过一定的算法进行压缩的,而压缩品质实质上就是压缩比率的大小,压缩的比率越高,生成的图像所占硬盘空间就越少,便是图片质量也就越差;相反,压缩比率越低,图像的品质越高,但是相应地占用硬盘空间也就越大。

② Tiff:标签图像文件格式(Tag Image File Format,TIFF)是一种灵活的位图格式,TIFF(Tag Image File Format)图像文件是图形图像处理中常用的格式之一,其图像格式很复杂,但由于它对图像信息的存放灵活多变,可以支持很多色彩系统,而且独立于操作系统,因此得到了广泛应用。TIFF文件以.tif为扩展名。

03

新的探索

变化一:这位仁兄的处理方式是把每张图片先用CompressionImage这个方法加载到内存进行编码压缩的,实际上这一步是没有必要的,不仅仅浪费了时间还没有节省空间,因为调用的第三方本身就带了图片压缩的功能,所以这一段我的项目去掉了;

变化二:这位仁兄处理是把一组图片一次压缩成一张tiff,我这边的应用场景是图片一张一张来,所以就是每来一张就压缩一张;

变化三:除了图片合成,我的项目中添加了tiff文件拆分的方法;

变化四:记录图片加载、合成、保存的时间并写入log文件.

04

源码分享

我这里测试采用的是控制台,运行后输入你也数值:要合并的图片的数量,就可以执行了,测试过程我只有一张图片,所以我将这张图片进行了克隆:

Program.cs:这里有三个方法,依次是Main、BmpToTiff和CopyImage,CopyImage负责图片克隆,BmpToTiff方法的for循环中可以选择图片合成的方案一或者二。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TiffHelper;

namespace TiffConsole
{
class Program
{
private static Stopwatch stopwatch = new Stopwatch();
static void Main(string[] args)
{
string filePath = @“C:\Users\majm\Desktop\新建文件夹”;
CopyImage(filePath);
BmpToTiff(filePath);
//SplitTiffToBMP.SplitTiff(filePath);//图片分割
Console.ReadKey();
}

    public static void BmpToTiff(string filePath)
    {
        List timeSpans = new List();
       
        string[] imagePaths = System.IO.Directory.GetFiles(filePath, "*.bmp");
        stopwatch.Start();
        for (int i = 0; i < imagePaths.Length; i++)
        {
            //调用方案1
            //var timeSpan = BitMiracle.Jpeg2Tiff(i, imagePaths.Length, filePath,  $"{i}.tif", 100);
            //调用方案2
            var timeSpan = RasterEdge.TIFFDocument(i,filePath);
            timeSpans.Add(timeSpan);
        }
        stopwatch.Stop();

        FileWrite.WriteLogFile("Id,LoadTime,MergeTime,SaveTime,TotalTime,flag", true);
        timeSpans.ForEach(n => FileWrite.WriteLogFile(n.ToString(), true));
        FileWrite.WriteLogFile("合成图片总计耗时:" + stopwatch.ElapsedMilliseconds.ToString() + "毫秒", true);
        Console.WriteLine("合成图片总计耗时:" + stopwatch.ElapsedMilliseconds.ToString() + "毫秒");
    }
    public static void CopyImage

你可能感兴趣的:(C#,c#,图像处理,开发语言)