裁剪大tif格式文件的问题(java语言实现)

Python021

裁剪大tif格式文件的问题(java语言实现),第1张

用c++实现的,先做一个对话框,一个按钮

void CTifSliceDlg::OnButton1()

{

IFH ifh// 文件头

WORD ec// 目录入口个数

DE *de1, *de2// 源和目的文件的目录入口

DWORD nextIFD// 下一个IFD偏移

DWORD offset, width, height// 图像数据偏移、宽度、高度

UpdateData()

long m_x1 = m_x - m_size / 2

long m_x2 = m_x + m_size / 2 - 1

long m_y1 = m_y - m_size / 2

long m_y2 = m_y + m_size / 2 - 1

FILE *fp1 = fopen("D:/zxz/imagery.tif", "rb")// 打开源图

FILE *fp2 = fopen("D:/zxz/" + m_filename + ".tif", "wb")// 打开目标图

fseek(fp1, 0, SEEK_SET)

fread(&ifh, sizeof(ifh), 1, fp1)// 读IFH

if ((ifh.byteOrder == 0x4949) &&(ifh.version == 0x2a)) // 判断字节顺序和版本是否有问题

{

fseek(fp1, ifh.offsetToIFD, SEEK_SET)// 定位到IFD

fread(&ec, 2, 1, fp1)// 读目录入口个数

de1 = new DE[ec]

de2 = new DE[ec]

fread(de1, sizeof(DE), ec, fp1)// 读所有目录入口

memcpy(de2, de1, sizeof(DE) * ec)// 复制为目标图的目录入口

fread(&nextIFD, 4, 1, fp1)// 读下一个IFD偏移

if (nextIFD == 0) // 为0表示没有下一个IFD

{

fwrite(&ifh, sizeof(ifh), 1, fp2)// IFH写入目标图

fwrite(&ec, 2, 1, fp2)// 目录入口个数写入目标图

for (int i = 0i <eci++)

{

switch (de2[i].tag)

{

case 256: //宽度

de2[i].valueOffset = m_x2 - m_x1 + 1// 修改目标图宽度

width = de1[i].valueOffset// 取源图宽度

break

case 257: //高度

de2[i].valueOffset = m_y2 - m_y1 + 1// 修改目标图高度度

height = de1[i].valueOffset// 取源图高度

break

case 273: //图像数据偏移

offset = de2[i].valueOffset// 取源图图像数据偏移

break

case 278: //图像数据行数

de2[i].valueOffset = m_y2 - m_y1 + 1// 修改目标图图像数据行数

break

case 279: //图像数据字节数

de2[i].valueOffset = (m_x2 - m_x1 + 1) * (m_y2 - m_y1 + 1)// 修改目标图图像数据字节数

break

}

}

fwrite(de2, sizeof(DE), ec, fp2)// 将目录入口写入目标图

fwrite(&nextIFD, 4, 1, fp2)// 将下一个IFD偏移写入目标图

long curpos = ftell(fp1)

char *buf = new char[offset - curpos]

fread(buf, offset - curpos, 1, fp1)// 读源图当前位置到图像数据之间的全部字节

fwrite(buf, offset - curpos, 1, fp2)// 写入目标图

delete[] buf

buf = new char[m_x2 - m_x1 + 1]

for (i = m_y1i <= m_y2i++)

{

fseek(fp1, offset + (i * width + m_x1), SEEK_SET)// 定位到图像第i行,m_x1处

fread(buf, m_x2 - m_x1 + 1, 1, fp1)// 读m_x1到m_x2之间的数据

fwrite(buf, m_x2 - m_x1 + 1, 1, fp2)// 写入目标图

}

delete[] buf

}

else

{

MessageBox("文件格式不正确!")

}

delete[] de1

delete[] de2

}

else

{

MessageBox("文件格式不正确!")

}

fclose(fp1)

fclose(fp2)

MessageBox("切片成功!")

}

1、java。

Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

Java编程语言的风格十分接近C++语言。继承了C++语言面向对象技术的核心,舍弃了容易引起错误的指针,以引用取代;移除了C++中的运算符重载和多重继承特性,用接口取代;增加垃圾回收器功能。

2、c++。

C++是一种使用广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。

3、c#。

C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。

C#由安德斯·海尔斯伯格主持开发,微软在2000年发布了这种语言,希望借助这种语言来取代Java。C#已经成为Ecma国际和国际标准组织的标准规范。

4、python 。

Python是一种面向对象的动态类型语言,它是解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。

python相比于C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。

5、golang。

Go(又称Golang)是Google开发的一种面向对象的静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。Go的并行模型采取类似模型的其他语言包括Occam和Limbo,但它也具有Pi运算的特征,比如通道传输。在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数。

与C++相比,Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。

参考资料来源:百度百科——java

参考资料来源:百度百科——c++

参考资料来源:百度百科——c#

参考资料来源:百度百科——python

参考资料来源:百度百科——go

getSubimage方法是进行图片裁剪。

举例:

public static void main(String[] args) {

try {

//从特定文件载入

BufferedImage bi = ImageIO.read(new File("c:\\test.jpg"))

bi.getSubimage(0, 0, 10, 10)//前两个值是坐标位置X、Y,后两个是长和宽

} catch (IOException e) {

e.printStackTrace()

}

}