Можно ли обрезать изображение без полной загрузки его в память?
Мне удалось сгенерировать изображение PNG с фракталом.
Высота изображения составляет 65 536 пикселей, а ширина - 65 536 пикселей. Он слишком велик, чтобы его можно было расшифровать в памяти и отобразить. У него, вероятно, много неиспользуемого пространства возле границ, и я хочу обрезать его, чтобы значительно уменьшить его площадь.
Я попробовал GIMP и GraphicsMagick, но GIMP заморозил мой компьютер, и GraphicsMagick не смог выделить достаточно памяти для изображения.
Я использую Linux, и у меня есть 16 ГБ оперативной памяти. Размер сжатого изображения составляет 6,2 МБ.
Можно ли обрезать границы без полной загрузки изображения в память?
FWIW, в конце концов я использовал сервер моей школы, но я все еще хочу знать ответ.
1 ответ
Фильтр "обрезки" ImageMagick должен уметь делать это эффективно.
https://www.imagemagick.org/Usage/crop/
Теоретически то, чего вы хотите достичь, определенно возможно. Просто нужно найти приложение, которое действительно делает это так.
Имейте в виду, что изображение размером 65536 x 65536 с 24-битным цветом будет занимать около 12 ГБ ОЗУ, поэтому на самом деле оно поместится в памяти.
Если это 32-битный цвет, это будет около 17 ГБ, но даже тогда вы можете загрузить все изображение в ОЗУ - Linux переполнит память в файле sawp. Это медленно, и производительность не будет очень хорошей, но на самом деле это не произойдет - это будет просто медленно, если у вас не закончится пространство подкачки.
Вы уже знаете декартово определение изображения.
Рассмотрим некоторый код Python для чтения файла в буферных загрузках разумного размера - выберите одну или несколько строк пикселей изображения на буфер, но достаточно мало в отношении доступности памяти.
На большинстве линий пикселей крайние левые и крайние правые пиксели могут быть отброшены. Первые и последние несколько "пограничных" линий, аналогично.
Размер буфера выходного файла может и будет отличаться от размера входного файла по определению.