У меня много огромных изображений (4000x4000px, PNG или JPG), и я хочу повернуть их на 90 ° или сжать. Меня не волнует скорость (задача может завершиться за секунды), меня волнует потребление памяти.
Есть ли какой-нибудь (нетривиальный?) Удобный для памяти способ выполнения таких преобразований? Я думаю о потоковой передаче -> с BMP, это довольно просто, просто прочитайте строку и поместите пиксели в определенные места в файле. Язык / платформа для меня неактуальны (у меня есть текущее приложение, написанное на C#).
Невозможно выполнить чистую обрезку JPEG, если вы не обрезаете линию MCU (минимальная кодированная единица) (обычно это означает, что верхняя и левая координаты должны делиться на 8 или 16). Таким образом, попытка выполнить обрезку с использованием операции потоковой передачи может быть более сложной, если ваш JPEG нарезан через MCU, поскольку вам нужно будет пересчитать все блоки. Если вас интересуют блочные преобразования JPEG, я рекомендую вам изучить библиотеки преобразования JPEG без потерь с открытым исходным кодом (либо для использования библиотек, либо для изучения того, как они работают).
Не могли бы вы подробнее объяснить Почему, что вам небезразлично потребление памяти? Такое изображение может занимать порядка 100 мегабайт памяти; у вас есть 2000 мегабайт, доступных даже на 32-битных машинах, и намного больше, чем на 64-битных машинах. И долго это не протянет. Почему вы оптимизируете удаление короткоживущих больших объектов из кучи?