Como Guy dijo, hay numerosos métodos de compresión sin pérdida. Cada método tiene sus aspectos positivos y negativos, y uno debe elegir uno teniendo en cuenta los datos iniciales. Generalmente, el algoritmo DEFLATE para datos de ráster continuos sirve muy bien.
Por lo general, el tamaño del archivo de ráster depende de la precisión de cada celda. Los tipos de datos enteros, por ejemplo, cuestan mucho menos que float32. Pero el tipo int solo puede contener enteros, mientras que float mantiene la parte fraccionaria del número. También tienes variantes, lo que significa cuántos bits eliges utilizar (int4, int8, int16, int32, etc.) para tu tipo de dato. Y dependiendo de la variante, tienes límites superiores e inferiores.
Como ejemplo práctico, si tienes un ráster de clasificación, donde cada celda de ráster corresponde a una clase, no necesitas guardar tu ráster como un float32 (que muchas aplicaciones tienen por defecto), sino que el tipo de datos int también te sirve muy bien. El ráster resultante será, si lo combinas con un algoritmo de compresión, de unos pocos megabytes, mientras que si hubieras elegido guardarlo como float y sin usar técnicas de compresión, el tamaño final se mediría en cientos de megabytes.
Al final del día, todo se reduce a tus tipos de datos iniciales y cuánta precisión quieres preservar.