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. 在数据 ...
随机推荐
- MySql之存储过程的使用
一:创建存储过程 1:简单存储过程 CREATE PROCEDURE 存储过程名() BEGIN SQL操作 END; 2:使用参数的存储过程 CREATE PROCEDURE 存储过程名(IN in ...
- 【PMP】项目目标的SMART原则
详细解读 Specific 具体的 用具体的语言清楚的说明要达成的标准. Measureable 可测量的 目标应该是明确的,而不是模糊的.应该有一组明确的数据,作为衡量是否达成目标的依据. Achi ...
- 11g新特性-SQL Plan Management
在11g之前版本,提供了stored outlines(sql概要)特性来保存sql的执行计划. 在11g中,引入了一个新的特性sql计划管理(sql plan management)特性来保存sql ...
- [转]MVC实用架构设计(三)——EF-Code First(3):使用T4模板生成相似代码
本文转自:http://www.cnblogs.com/guomingfeng/p/mvc-ef-t4.html 〇.目录 一.前言 二.工具准备 三.T4代码生成预热 (一) 单文件生成:Hello ...
- js 学习
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- 第三部分:Android 应用程序接口指南---第二节:UI---第九章 搜索
第9章 搜索 在android平台上搜索是一个核心的用户功能.无论内容位于设备或网络上,用户应该能够搜索任何对它们可用的数据.为了创建一个一致的用户搜索体验,Android平台提供了一个搜索框架帮助你 ...
- Handler消息传递机制浅析
http://www.runoob.com/w3cnote/android-tutorial-handler-message.html https://blog.csdn.net/lowprofile ...
- (1) Mysql高性能优化规范建议
数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意 ...
- 按enter键触发登录事件
$(document).keydown(function(event){ if(event.keyCode==13){ $(".submit").click(); } });
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-8底层驱动之RTC
视频简介:该视频介绍iCore3应用开发平台中RTC的基本配置方法以及在应用开发平台中的实时显示. 源视频包下载地址:链接:http://pan.baidu.com/s/1o80jHvc 密码:f8r ...