es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cambiando filas por banda usando tiffcp en toda la carpeta.

Estoy intentando cambiar las filas por banda en todos los archivos tiff dentro de una carpeta y sus subcarpetas, no importa si reemplaza los archivos originales o guarda como nuevos archivos. ¿Hay alguna manera de cambiarlos en lote en lugar de los archivos tiff individuales con:

tiffcp -r 20 original.tif result.tif

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, existe una forma de cambiar por lotes las filas por tira en todos los archivos tiff dentro de una carpeta y sus subcarpetas utilizando Perl y la biblioteca LibTIFF. Aquí hay un fragmento de código que debería hacer el truco:

    use strict;
    use warnings;
    use File::Find;
    use File::Temp qw(tempfile);
    
    use constant ROWS_PER_STRIP => 20;
    
    find(\&process_tiff, '/ruta/a/la/carpeta');
    
    sub process_tiff {
        # omite los archivos no tiff
        return unless /\.tif$/i;
    
        # abre el tiff de entrada
        my $in_tif = TIFFOpen($_, 'r');
        die "No se puede abrir $File::Find::name para leer: $!" unless $in_tif;
    
        # obtiene los detalles del tiff de entrada
        my $rows_per_strip = TIFFGetField($in_tif, TIFFTAG_ROWSPERSTRIP);
    
        # omite el tiff si las filas por tira ya están establecidas en el valor deseado
        return if $rows_per_strip == ROWS_PER_STRIP;
    
        # obtiene el nombre del archivo de salida
        my $out_tif = $in_tif;
        my ($fh, $out) = tempfile();
        binmode $fh;
        TIFFSetField($out_tif, TIFFTAG_ROWSPERSTRIP, ROWS_PER_STRIP);
    
        # copia los datos del tiff al archivo de salida
        while (TIFFReadScanline($in_tif, my $buf, TIFFGetField($in_tif, TIFFTAG_IMAGELENGTH), TIFFGetCurrentDirectory($in_tif))) {
            print $fh $buf;
        }
    
        close $fh;
        TIFFClose($in_tif);
        rename $out, $File::Find::name;
    }
    

    Este código utiliza el módulo File::Find para recorrer de forma recursiva la carpeta y sus subcarpetas para encontrar todos los archivos tiff. Para cada archivo tiff, lo abre utilizando la biblioteca LibTIFF, lee su valor actual de filas por tira y omite el archivo si ya está establecido en el valor deseado. Si no, crea un archivo temporal para escribir los datos de salida, establece el valor de filas por tira en el deseado y lee cada línea de escaneo de datos del tiff de entrada y la escribe en el archivo de salida. Finalmente, cierra ambos archivos y cambia el nombre del archivo temporal al nombre original del archivo para reemplazarlo. Tenga en cuenta que este código supone que el tiff de entrada está en tiras, no en teselas. Si está en teselas, deberá usar funciones diferentes para leer/escribir los datos.

Comments are closed.