Как я могу обрезать большой JPG и извлечь небольшую его часть? Проблема в том, что основные JPG такие большие, и я не могу загрузить их все в памяти. Я использовал convert.exe из ImageMagick, но он не работает должным образом во всех версиях окон, и я предпочитаю какой-то C# метод вместо автономного exe.Обрезка JPG без загрузки всего его в память
ответ
Я нашел решение командной строки, которое не зависит от внешних библиотек, jpegtran.
Вы можете jpegtran.exe рядом с вашим основным ехе и вызвать его с этими параметрами:
jpegtran -crop WxH+X+Y input_file output_file
Скачать jpegtran здесь: http://jpegclub.org/jpegtran/
Все декодеры Jpeg, которые я видел, сначала выгружают Jpeg в память, а затем начинают декодирование. Это из-за характера формата Jpeg, который отличается от Bitmap, вы не можете рассчитать местоположение файла для пикселя.
Если вы решили не загружать в память, то у вас есть много файлов, которые делают ваш декодер менее интенсивным в памяти, но больше интенсивнее ввода-вывода.
проект NanoJpeg хорошее начало https://github.com/Deathspike/NanoJPEG.NET/blob/master/NanoJPEG.cs
Декодер vips jpeg будет распаковываться по требованию, поэтому, если вам нужен только фрагмент в верхней части файла, он будет декодировать только верхнюю часть файла. Если вы попросите кусок внизу, он распакует все это, но сохранит только нижнюю часть в памяти, он отбросит нежелательную часть. – user894763
Есть несколько возможностей. Вы можете использовать stream
, который является частью ImageMagick, или vips
. Давайте сначала сделаем stream
.
Я могу сделать большой (10,000x5,000) JPEG, как это:
convert -size 10000x5000 xc:blue BigBoy.jpg
затем использовать stream
, как это, чтобы извлечь кусок из 1,000x1,000 смещение 8000 + 50
stream -extract 1000x1000+8000+50 BigBoy.jpg extract.rgb
и файл extraact.rgb
- 3000000 байт, то есть 1,000x1,000 при 3 байтах/пиксель.
Если бы я сделать это с time -l
вы можете увидеть резидентного набора мало, несмотря на большое изображение
/usr/bin/time -l stream -extract 1000x1000+8000+50 BigBoy.jpg extract.rgb
0.81 real 0.79 user 0.01 sys
2924544 maximum resident set size <----- 2MB RAM ****
0 average shared memory size
0 average unshared data size
0 average unshared stack size
796 page reclaims
Вы можете конвертировать, что extract.rgb
в JPEG с convert
convert -size 1000x1000 -depth 8 extract.rgb chunk.jpg
Я не эксперт на vips
, но у вас может быть некоторый успех с этой командой, которая также показывает использование пиковой памяти с флагом --vips-leak
в конце
vips extract_area BigBoy.jpg SmallBoy.jpg 8000 50 1000 1000 --vips-leak
memory: high-water mark 8.72 MB
Есть ли. Net/C# порт ImageMagic или Vips? – n00b
Существует реализация .Net, поддерживаемая @dlemstra на SO, которая может консультироваться далее ... http://magick.codeplex.com –
Или я полагаю, что C# должен иметь что-то вроде 'system()' функция для нереста программ командной строки ... –
- 1. Ruby/Rails анализирует XML без загрузки всего его в память
- 2. Масштабирование изображения Java без загрузки всего изображения в память
- 3. Python FTP «chunk» iterator (без загрузки всего файла в память)
- 4. Обработка XML без загрузки всего документа в память?
- 5. Слияние огромных файлов без загрузки всего файла в память?
- 6. C# изменить кодировку файла без загрузки всего файла в память
- 7. Загрузите из хранилища Laravel без загрузки всего файла в память
- 8. Извлеките небольшую часть изображения без загрузки всего его
- 9. Завершение рабочего процесса без его загрузки в память
- 10. PHP для добавления файла без загрузки его в память?
- 11. Запрос xml-файла без его загрузки в память?
- 12. Обрезать изображение без загрузки в память
- 13. Найти и заменить данные в файле (без загрузки всего объекта)?
- 14. Получить размер изображения без загрузки в память
- 15. Как загрузить строки из файла с интервалом в NodeJS без загрузки всего файла в память?
- 16. Как обновить файл xml без загрузки всего файла в памяти
- 17. design mongodb для загрузки всего содержимого в память
- 18. Как я могу прочитать/передать файл без загрузки всего файла в память?
- 19. Как работать с файлом Xml без загрузки всего документа в память?
- 20. Изменить атрибут в очень большом XML без загрузки всего
- 21. Perl: Загрузка всего .jpg из веб-каталога
- 22. Способ получить список файлов из загруженного zip без загрузки всего файла ZIP в память?
- 23. Как я могу получить список методов в jar без загрузки всего файла в память?
- 24. Быстрый доступ к ключевому файлу в файле (без загрузки всего файла в память)
- 25. C# Добавить массив байтов в начало файла (без загрузки всего файла в память)
- 26. Есть ли способ тренировать нейронную сеть Encog без загрузки всего набора тренировок в память?
- 27. Создать скриншот без загрузки всего видео
- 28. Загрузка значения атрибута без загрузки всего объекта
- 29. Лучший способ чтения из большого CSV-файла без загрузки всего в память с помощью Javascript
- 30. Как загрузить часть изображения TIFF без загрузки всего изображения в память?
Что вы пытается, показать нам свою вопрос, пробовал использовать filestream? то вы передаете его на диск, а не в память, он будет намного медленнее, чем просто нажимать его на память и обрабатывать там. Размер в памяти должен быть примерно шириной * height * 4channels * 8bit = общие бит в памяти для растрового изображения. изображение 41mp (lumia 1020) должно быть около 150 МБ в памяти, что вполне приемлемо, и я думаю, что это код для обрезки, который вы пытались использовать для хранения свиней. –
Это для мобильного телефона для Windows 8? какова оценка размера изображения? – n00b