Problema al recortar archivos grandes en formato tif (implementado en lenguaje java)
Implementado con c++, primero crea un cuadro de diálogo y un botón
void CTifSliceDlg::OnButton1()
{
IFH ifh ; // Encabezado del archivo
WORD ec; // Número de entradas del directorio
DE *de1, *de2 // Entradas del directorio de los archivos de origen y de destino
< p; > DWORD nextIFD; // Desplazamiento de IFD siguienteDesplazamiento de DWORD, ancho, alto; // Desplazamiento de datos de imagen, ancho, alto
UpdateData();
largo m_x1 = m_x - m_tamaño / 2
largo m_x2 = m_x m_tamaño / 2 - 1
largo m_y1 = m_y - m_tamaño / 2; m_y2 = m_y m_size / 2 - 1;
ARCHIVO *fp1 = fopen("D:/zxz/imagery.tif", "rb"); // Abre la imagen de origen
ARCHIVO *fp2 = fopen("D:/zxz/" m_filename ".tif", "wb" // Abre la imagen de destino
fseek(fp1, 0, SEEK_SET);
fread(amp; ifh, sizeof(ifh), 1, fp1); // Leer IFH
if ((ifh.byteOrder == 0x4949) amp; amp; (ifh. version = = 0x2a)) // Determinar si hay un problema con el orden de los bytes y la versión
{
fseek(fp1, ifh.offsetToIFD, SEEK_SET); p>
fread(amp;ec, 2, 1, fp1); //Número de entradas del directorio de lectura
de1 = new DE[ec];
de2 = new DE[ec];
fread(de1, sizeof(DE), ec, fp1); // Lee todas las entradas del directorio
memcpy(de2, de1, sizeof(DE) * ec); // Copiar como entrada de directorio de la imagen de destino
fread(amp; nextIFD, 4, 1, fp1); // Leer el siguiente desplazamiento IFD
if ( nextIFD == 0) // 0 significa que no hay siguiente IFD
{
fwrite(amp; ifh, sizeof(ifh), 1, fp2); Imagen
fwrite(amp; ec, 2, 1, fp2); // Escribe el número de entradas del directorio en la imagen de destino
for (int i = 0; i lt; ec; i )
{
cambiar (de2[i].tag)
{
caso 256: //Ancho
de2[i].valueOffset = m_x2 -
m_x1 1; //Modificar el ancho de la imagen de destino
width = de1[i].valueOffset //Obtener el ancho de la imagen de origen
break;
case 257: //Altura
de2[i].valueOffset = m_y2 - m_y1 1; // Modifica la altura de la imagen de destino
height = de1[i] .valueOffset; // Obtener la altura de la imagen de origen
break;
case 273: //Desplazamiento de los datos de la imagen
offset = de2[i].valueOffset; //Obtener el desplazamiento de los datos de la imagen de origen Shift
break;
case 278: //Número de filas de datos de la imagen
de2[i].valueOffset = m_y2 - m_y1 1; // Modificar la imagen de destino Número de filas de datos de imagen
break;
case 279: //Número de bytes de datos de imagen
de2[ i].valueOffset = (m_x2 - m_x1 1) * (m_y2 - m_y1 1); // Modifica el número de bytes de datos de la imagen de destino
break
}
}
fwrite(de2, sizeof(DE), ec, fp2 // Escribe la entrada del directorio en la imagen de destino
fwrite(amp; nextIFD, 4); , 1, fp2); // Compensar el siguiente IFD Mover y escribir en la imagen de destino
long curpos = ftell(fp1);
char *buf = new char[offset - curpos];
fread(buf, offset - curpos, 1, fp1); // Lee todos los bytes entre la posición actual de la imagen de origen y los datos de la imagen
fwrite(buf). , offset - curpos, 1, fp2); // Escribe la figura de destino
eliminar[] buf;
buf = new char[m_x2 - m_x1 1];
for (i = m_y1; i lt; = m_y2; i )
{
fseek(fp1, offset (i * ancho m_x1), SEEK_SET); la i-ésima fila de la imagen en m_x1
fread(buf, m_x2 - m_x1 1, 1, fp1 // Lee los datos entre m_x1 y m_x2
fwrite(buf); , m_x2 - m_x1 1, 1, fp2); // Escribe la figura de destino
}
eliminar[] buf;
}
else
{
MessageBox("¡El formato del archivo es incorrecto! ");
}
eliminar[] de1;
eliminar[
] de2;
}
else
{
MessageBox("¡El formato del archivo es incorrecto!");
}
fclose(fp1);
fclose(fp2);
MessageBox("¡Corte exitoso!"); > }