Tif文件合并类
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq; namespace Common
{
/// <summary>
/// Title Tif文件合并类
/// Author:ward
/// </summary>
public class Tiff
{
/// <summary>
/// 获取图像页数
/// </summary>
/// <param name="imagePath"></param>
/// <returns></returns>
public static int GetPageNumber(string imagePath)
{
using (Image image = Bitmap.FromFile(imagePath))
{
Guid objGuid = image.FrameDimensionsList[];
FrameDimension objDimension = new FrameDimension(objGuid); return image.GetFrameCount(objDimension);
}
} /// <summary>
/// 将给定的文件 拼接输出到指定的tif文件路径
/// </summary>
/// <param name="imageFiles">文件路径列表</param>
/// <param name="outFile">拼接后保存的 tif文件路径</param>
/// <param name="compressEncoder">压缩方式,建议CompressionCCITT4</param>
public static void JoinTiffImages(ArrayList imageFiles, string outFile, EncoderValue compressEncoder)
{
//如果只有一个文件,直接复制到目标
if (imageFiles.Count == )
{
File.Copy((string)imageFiles[], outFile, true);
return;
} Encoder enc = Encoder.SaveFlag; EncoderParameters ep = new EncoderParameters();
ep.Param[] = new EncoderParameter(enc, (long)EncoderValue.MultiFrame);
ep.Param[] = new EncoderParameter(Encoder.Compression, (long)compressEncoder); Bitmap pages = null;
int frame = ;
ImageCodecInfo info = GetEncoderInfo("image/tiff"); foreach (string strImageFile in imageFiles)
{
if (frame == )
{
pages = (Bitmap)Image.FromFile(strImageFile);
//保存第一个tif文件 到目标处
pages.Save(outFile, info, ep);
}
else
{
//保存好第一个tif文件后,其余 设置为添加一帧到 图像中
ep.Param[] = new EncoderParameter(enc, (long)EncoderValue.FrameDimensionPage); Bitmap bm = (Bitmap)Image.FromFile(strImageFile);
pages.SaveAdd(bm, ep);
bm.Dispose();
} if (frame == imageFiles.Count - )
{
//flush and close.
ep.Param[] = new EncoderParameter(enc, (long)EncoderValue.Flush);
pages.SaveAdd(ep);
}
frame++;
}
pages.Dispose(); //释放资源
return;
} /// <summary>
/// 拼接两个tif文件 保存到文件2中
/// </summary>
/// <param name="filePath">tif文件1</param>
/// <param name="targetFile">tif文件2</param>
public static void AppendToTiff(string filePath, string targetFile)
{
ArrayList list = new ArrayList(); //保存所有 tif文件路径 #region 分割tif文件1 string tempDirectory1 = string.Empty;
list.AddRange(SplitTif(filePath, out tempDirectory1)); #endregion #region 分割tif文件2 string tempDirectory2 = string.Empty;
list.AddRange(SplitTif(targetFile, out tempDirectory2)); #endregion //2. 拼接所有tif页 //2.1 删除原目标文件
File.Delete(targetFile);
//2.2 拼接 并按原路径生成tif文件
JoinTiffImages(list, targetFile, EncoderValue.CompressionCCITT3); //3. 删除临时目录
DirectoryInfo di2 = new DirectoryInfo(tempDirectory2);
di2.Delete(true); DirectoryInfo di1 = new DirectoryInfo(tempDirectory1);
di1.Delete(true); } /// <summary>
/// 将给定文件 分割成多个tif文件 到临时目录下
/// </summary>
/// <param name="targetFile">目标文件</param>
/// <param name="tempDirectory">临时目录路径,删除用</param>
/// <returns>分割后多个文件路径集合</returns>
public static ArrayList SplitTif(string targetFile, out string tempDirectory)
{
ArrayList list = new ArrayList();
using (Image img = Image.FromFile(targetFile))
{
Guid guid = img.FrameDimensionsList[]; System.Drawing.Imaging.FrameDimension dimension = new System.Drawing.Imaging.FrameDimension(guid); int nTotFrame = img.GetFrameCount(dimension); //tif总页数 int nLoop = ; //索引
//生成临时目录 存放 单tif页
tempDirectory = Path.Combine(Path.GetDirectoryName(targetFile), Guid.NewGuid().ToString());
if (!Directory.Exists(tempDirectory))
{
Directory.CreateDirectory(tempDirectory);
} EncoderParameters ep = new EncoderParameters();
ep.Param[] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame);
ep.Param[] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionCCITT3);//压缩方式 CompressionCCITT3主要用于传真 ImageCodecInfo info = GetEncoderInfo("image/tiff"); for (nLoop = ; nLoop < nTotFrame; nLoop++)
{
img.SelectActiveFrame(dimension, nLoop);
//保存 单tif页
string newfilePath = Path.Combine(tempDirectory, nLoop.ToString() + ".tif"); img.Save(newfilePath, info, ep);
//将路径存入 list中
list.Add(newfilePath);
}
}
return list;
} /// <summary>
/// 获取支持的编码信息
/// </summary>
/// <param name="mimeType">协议描述</param>
/// <returns>图像编码信息</returns>
private static ImageCodecInfo GetEncoderInfo(string mimeType)
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (int j = ; j < encoders.Length; j++)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
} throw new Exception(mimeType + " mime type not found in ImageCodecInfo");
} }
}
Tif文件合并类的更多相关文章
- 将多个图片合并到一个TIF文件里(非 GDAL) 优化版
不知道为什么,网上对TIF的操作的资料少得可怜,包括CodeProject上都没有找到多少,在网上大多用GDAL,但这个东西,对只想做个合并图片的功能来说,实在是牛刀杀鸡,(9个DLL要带全,相当的恐 ...
- Python之FTP多线程下载文件之分块多线程文件合并
Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...
- C# 文件操作类大全
C# 文件操作类大全 时间:2015-01-31 16:04:20 阅读:1724 评论:0 收藏:0 [点我收藏+] 标签: 1.创建文件夹 //usin ...
- C++的IO处理中的头文件以及类理解(2)<sstream>头文件
C++的IO处理中的头文件以及类理解(2)<sstream>头文件 头文件<sstream>中定义的类型都继承iostream头文件中定义的类型.除了继承得来的操作,sstre ...
- Hadoop经典案例(排序&Join&topk&小文件合并)
①自定义按某列排序,二次排序 writablecomparable中的compareto方法 ②topk a利用treemap,缺点:map中的key不允许重复:https://blog.csdn.n ...
- hadoop 文件合并
来自:http://blog.csdn.net/dandingyy/article/details/7490046 众所周知,Hadoop对处理单个大文件比处理多个小文件更有效率,另外单个文件也非常占 ...
- File 文件操作类 大全
File 文件操作类 大全 许多人都会对文件操作感到很难 我也是 但是一个好的项目中必定会涉及到文件操作的 文件的复制 粘贴 等等等 公司大佬写了 一个文件操作的工具类 感觉还是棒棒的啦 ...
- Java常用工具类---IP工具类、File文件工具类
package com.jarvis.base.util; import java.io.IOException;import java.io.InputStreamReader;import jav ...
- 第3节 mapreduce高级:5、6、通过inputformat实现小文件合并成为sequenceFile格式
1.1 需求 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案 1.2 分析 小文件的优化无非以下几种方式: 1. 在数据 ...
随机推荐
- java中常用jar包
commons-io.jar:可以看成是java.io的扩展,用来帮助进行IO功能开发.它包含三个主要的领域:Utilityclasses-提供一些静态方法来完成公共任务.Filters-提供文件过滤 ...
- 《Unix&Linux大学教程》学习笔记四:标准I/O 与 过滤器
1:标准IO Unix中的标准IO主要包括:标准输入.标准输出(正常输出).标准错误(异常信息) 2:重定向输出 内容 > 文件名 :将内容输出到文件,并且覆盖文件原来内容:文件不存在则新建 内 ...
- RabbitMQ使用技巧
一. net客户端介绍 http://www.cnblogs.com/hsyzero/p/6297644.html 二. RabbitMQ消息应答 执行一个任务可能需要花费几秒钟,你可能会担心如 ...
- Keepalived源码安装
1.编译.安装 # tar -xvf keepalived-1.3.9.tar.gz # cd keepalived-1.3.9/ # ./configure -prefix=/usr/local/k ...
- 关于JS拒绝访问错误
错误如图所示,只要点击红色区域 内的任何一部分都会弹出 “js拒绝访问”,以为是浏览器的原因,卸载安装都不好使,左面的是树.点击树的节点弹出右面相应的页面. Node.NavigateUrl = “h ...
- Atitit 常见每日流程日程日常工作.docx v4
Atitit 常见每日流程日程日常工作.docx v4 ----早晨 签到 晨会,每天或者隔天 每日计划( )项目计划,日常计划等. mailbox读取检查 每日趋势 推库 -----下午 签退 每日 ...
- Atitit 数据库表文档生成解决方案
Atitit 数据库表文档生成解决方案 1.1. Sql dml文件结构法 最快速1 1.2. Sql法+sp存储过程 (表格式样)1 1.3. Navicate uml法 (uml格式)2 1.4. ...
- Socket网络编程--聊天程序(2)
上一节简单如何通过Socket创建一个连接,然后进行通信.只是每个人只能说一句话.而且还是必须说完才会接收到信息,总之是很不方便的事情.所以这一小节我们将对上一次的程序进行修改,修改成每个人可以多说话 ...
- Java 汇编代码
https://shipilev.net/blog/2015/black-magic-method-dispatch/ https://github.com/shipilev/article-meth ...
- Python3自定义http/https请求拦截mitmproxy脚本
[本文出自天外归云的博客园] 脚本内容 代码如下: from mitmproxy import http, ctx from multiprocessing import Lock class Fil ...