Red de conocimientos turísticos - Información sobre alquiler - Problema al recortar archivos grandes en formato tif (implementado en lenguaje java)

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 siguiente

Desplazamiento 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!"); > }