Здесь же я хочу рассмотреть файлы с другой стороны, а именно преобразовывая или извлекая из них различные изображения.
Тема витала на форуме уже давно и первые начинания были ещё в 2009 году. С тех пор находились новые утилитки и исследовались различные типы файлов.
Тема будет полезна тем кто пользуется плагинами просмотра картинок такие как Review, Multimedia Viewer и (кажется) PictureView3 - такие, которые умеют автоматически определять тип файла открытого во встроенном вьювере Far.
Основная настройка плагинов должна быть следующей:
включить автоматическое распознавание файлов изображений во встроенном вьювере Far;
добавить расширение TMP в список какого-нибудь универсального декодера (у меня GFL)
Также, для более удобного перехода к просмотру следующего файла, был создан дополнительный макрос (к плагину Review, которым я пользуюсь) для перехода к следующему/предыдущему файлу
Last edited by SlashNet on Fri 14 Jan, 2022 21:12, edited 2 times in total.
Начну, пожалуй, с самого интересного: видеофайлы.
Как и другие пользователи, я столкнулся с нестабильными но очень раздражающими вылетами плагина (а за ним и Фара) при открытии видеофайлов. Видео я в Фаре не смотрю - мне необходимо всего лишь понять что это за файл без запуска внешнего плейера. Поэтому возникла идея генерировать превьюшки с кадрами из видео и автоматически их показывать.
С этой задачей неплохо справляется утилитка Movie Thumbnailer (mtn) она довольно шустрая (по крайней мере на современных компьютерах) и поддерживает большинство популярных форматов видео. Из минусов отмечу, что генерирует картинку исключительно в файл с тем же названием, что и у оригинального видео, и нет поддержки HEVC-кодека (ещё, почему-то, спотыкается на некоторых коротких файлах). Но для 90% файлов справляется на ура.
Батник для базового использования будет выглядеть примерно так:
if exist "%temp%\mtn_temp\%~n1_s.jpg" type "%temp%\mtn_temp\%~n1_s.jpg"
rmdir /q /s "%TEMP%\mtn_temp" 1>nul 2>nul
ассоциация для файлов самая обычная: view:<iviewvideo.cmd "!\!.!"
А выглядеть это будет как-то так (цвет заголовка можно настроить):
В моём же случае мне этого показалось мало - некоторые видеофайлы вышеописанной программой обрабатываться не захотели и было решено добавить вспомогательную программу именно для таких случаев. А какая самая многофункциональная программа обработки видео? Правильно - ffdshow. После различных экспериментов стало понятно, что процесс создания превьюшки этой программой значительно медленнее (особенно на менее современных компьютерах). Поэтому ограничился отображением всего четырёх кадров.
Выглядит это примерно так:
Но всё же такая картинка генерировалась заново при каждом новом просмотре (и не всегда с приемлемой скоростью). Так что появилась ещё одна идея: сохранять сгенерированные превьюшки, а затем просто показывать их без повторной генерации. Наиболее удобным местом для хранения данной информации мне приглянулось одно из свойств файловой системы NTFS, а именно альтернативные потоки файлов.
Так что на данный момент, мой текущий батник обрабатывает видеофайлы следующим образом:
При открытии проверяется у файла видео наличие альтернативного потока с названием VideoThumb.jpg.
Если он есть - показываем готовую превьюшку
Если его нет - генерируем новую, показываем и пытаемся записать её в альтернативный поток видеофайла (если файловая система не поддерживает альтернативные потоки - FAT32, файлы на CD-дисках или на сетевых шарах, то для этих файлов превьюшка будет просто генериться каждый раз заново).
К тому же он значительно распух из-за всяких дополнительных функций которые я дописывал время от времени.
Используются в нём следующие программы:
вышеупомянутый mtn - для основного функционала
ffdshow - для генерации дополнительных превьюшек
MediaInfo и ImageMagick - в качестве вспомогательных
Также, для вертикальных видео с телефонов, превьюшка создаётся не 2х2, а 4х1 для лучшего заполнения экрана.
Обратите внимание: при добавлении превьюшки в альтернативный поток файла у него обновится дата и время последней записи / изменения на текущие.
В современных аудиофайлах тоже можно отыскать картинки которые можно посмотреть.
Нет. Мы не будем генерировать спектрограмму файла (я пробовал - результат огорчил своим быстродействием).
Довольно часто можно обнаружить обложки музыкальных альбомов в файлах .mp3, .flac и .m4a.
Для их вытаскивания пригодится утилитка работы с метаданными - ExifTool
Для MP3 и FLAC командная строка будет выглядеть следующим образом:
Вызывается, как обычно: view:< CDRview.cmd "!\!.!"
Используется автоопределение формата файла.
В случае предпросмотра файла старого формата - будет показана маленькая превьюшка размером 96*96 (если она присутствует в файле).
Файлы более свежих форматов содержат превьюшки значительно лучшего качества.
.XPS - Неудавшаяся попытка Майкрософт придумать PDF
Самый простой способ заглянуть в файл - следующий:
Конечно, превьюшка содержащаяся в файле слишком мелкая и некачественная, но как получше рассмотреть первую страницу - напишу немного ниже.
.PPTX, .PPSX - PowerPoint презентация
В файле, обычно, содержится превьюшка небольших размеров. Чаще всего это JPEG-файл, реже - WMF. Во втором случае у меня используется дополнительная утилитка NConvert от XnView для конвертации картинки в растровый формат (её, думаю, вполне можно заменить чем-нибудь аналогичным). Так же и с ZIP-архиватором - тут (по историческим причинам) используется pkzipc.exe, но можно использовать и аналогичный.
Вызывается, как обычно: view:< PPTXpreview.cmd "!\!.!"
.CBR и .CBZ - близнецы-братья представляющие собой архив rar или zip с картинками. Используются, обычно, для комиксов, но, нередко и для сканов других печатных изданий. Конечно, можно зайти в такой файл вручную и просмотреть изображения обычным способом. Но для просмотра первой по списку картинки (обычно это обложка печатного издания) можно использовать следующий командный файл (используется автоопределение типа файла, так как нередко расширения бывают перепутаны):
for /f "delims=" %%b in ('%binpath%\Archivers\ZIP\unzip.exe -l "%~1" ^| %binpath%\UnxUtils\grep.exe -E --regexp=".jpg|.jpeg|.png|.gif|.webp" ^| sort /+31 ^| %binpath%\UnxUtils\head.exe --lines=1 ^| %binpath%\UnxUtils\tail.exe --bytes=+29') do %binpath%\Archivers\ZIP\unzip.exe -p "%~1" "%%b"
exit /b
:CBRfile
chcp 866 > nul
for /f "delims=" %%b in ('%binpath%\Archivers\RAR\Rar_400.exe v "%~1" ^| %binpath%\UnxUtils\grep.exe -E --regexp=".jpg|.jpeg|.png|.gif|.JPG|.webp" ^| sort ^| %binpath%\UnxUtils\head.exe --lines=1 ^| %binpath%\UnxUtils\tail.exe --bytes=+2') do %binpath%\Archivers\RAR\Rar_400.exe p -inul -- "%~1" "%%b"
exit /b
Вызывается, как обычно: view:< CBZpreview.cmd "!\!.!"
Архиватор RAR тут используется старой версии (4.00), так как в новых версиях архиватора слегка изменился формат вывода списка файлов, а руки у меня так и не дошли переделать батник.
.EMZ - gzip-нутый emf-файл
Не помню где мне попались эти файлы, но пусть будут для коллекции.
Правильно ли я понимаю, что технически возможно скомпоновать общий скрипт, который будет анализировать расширение и выдавать картинку для любого из перечисленных типов файлов?
Такой скрипт было бы удобно использовать «широким кругам пользователей».
HaRT wrote: ↑Sat 15 Jan, 2022 16:21
Правильно ли я понимаю, что технически возможно скомпоновать общий скрипт,
У меня сейчас так и есть (так удобнее вносить правки или добавлять новые форматы). Сюда просто выдёргиваю более-менее причёсанные куски относящиеся к тому или иному типу файлов. Первая версия выглядела именно так как показано в этом посте.
Но на данный момент этот батник жутко непричёсан, с кучей закоментированных строк от предыдущих решений и неиспользуемых секций.
Вот кусок из начала батника. Не всё работает идеально, плюс есть свои личные "форматы" файлов:
rem ___Растр____________________________________
for %%b in (".HIR" ".ART" ".CGM" ".MAX" ".CMX" ".WPG" ".NCD" ".SNA" ".SCR" ".$C" ".LDF" ".PS" ".EPS" ".JNG" ".NLM" ".WAL" ".SKP" ".ACR") Do if /i "%~x1" == %%b goto PNGfile
for %%b in (".AI") Do if /i "%~x1" == %%b goto AIfile
for %%b in (".CR2") Do if /i "%~x1" == %%b goto CR2file
for %%b in (".VTF") Do if /i "%~x1" == %%b goto VTFfile2
for %%b in (".Z80") Do if /i "%~x1" == %%b goto ZXfile
for %%b in (".PYXEL") Do if /i "%~x1" == %%b goto PYXELProjectfile
for %%b in (".3DXML") Do if /i "%~x1" == %%b goto 3DXMLfile
for %%b in (".WEBP") Do if /i "%~x1" == %%b goto WEBPfile
for %%b in (".BPG") Do if /i "%~x1" == %%b goto BPGfile
for %%b in (".PJG") Do if /i "%~x1" == %%b goto PJGfile
for %%b in (".XNB") Do if /i "%~x1" == %%b goto XNAfile
for %%b in (".FLIF") Do if /i "%~x1" == %%b goto FLIFfile
for %%b in (".AMI" ".ART" ".CDU" ".CHE" ".CWG" ".DD" ".DOL" ".DRP" ".DRZ" ".FGS" ".FPT" ".GCD" ".GG" ".GIG" ".GIH" ".HED" ".HIR" ".IPH" ".IPT" ".ISM" ".JJ" ".KOA" ".MCI" ".MIL" ".MON" ".OCP" ".P64" ".PI" ".PMG" ".RP" ".RPM" ".SAR" ".VID") Do if /i "%~x1" == %%b goto IVfile
for %%b in (".mfphoto") Do if /i "%~x1" == %%b goto MFPhoto
for %%b in (".zxp") Do if /i "%~x1" == %%b goto RecoilFile
for %%b in (".pic") Do if /i "%~x1" == %%b goto EPiviewFile
for %%b in (".jxl") Do if /i "%~x1" == %%b goto JpegXLFile
for %%b in (".avif") Do if /i "%~x1" == %%b goto AVifFile
rem ___Упакованный____________________________________
for %%b in (".PSDR") Do if /i "%~x1" == %%b goto RARthumbfile
for %%b in (".PDFR" ".DJVR" ".RTFR" ".VIDEOR") Do if /i "%~x1" == %%b goto RARpackedfile
for %%b in (".TXTR" ".DOCR" ".HTMR" ".HTMLR") Do if /i "%~x1" == %%b goto CompressedBOOKfile
for %%b in (".FB2R") Do if /i "%~x1" == %%b goto CompressedFB2file
rem ___Вектр____________________________________
rem for %%b in (".SVG" ".SVGZ") Do if /i "%~x1" == %%b goto IMfile
for %%b in (".SVG" ".SVGZ") Do if /i "%~x1" == %%b goto SVGfile
for %%b in (".FIG") Do if /i "%~x1" == %%b goto FIGfile
for %%b in (".GV") Do if /i "%~x1" == %%b goto GVfile
for %%b in (".CDR") Do if /i "%~x1" == %%b goto CDRfile
for %%b in (".EMZ") Do if /i "%~x1" == %%b goto EMZfile
for %%b in (".BLEND") Do if /i "%~x1" == %%b goto Blenderfile
rem ___eBook____________________________________
for %%b in (".FB2") Do if /i "%~x1" == %%b goto FB2file
for %%b in (".FB3") Do if /i "%~x1" == %%b goto FB3file
for %%b in (".LIT") Do if /i "%~x1" == %%b goto LITfile
for %%b in (".epub") Do if /i "%~x1" == %%b goto ePUBfile
for %%b in (".CBR") Do if /i "%~x1" == %%b goto CBRfile
for %%b in (".CBZ") Do if /i "%~x1" == %%b goto CBZfile
for %%b in (".XPS" ".OXPS") Do if /i "%~x1" == %%b goto XPSfile
for %%b in (".PDF") Do if /i "%~x1" == %%b goto XPSfile
for %%b in (".DJVU") Do if /i "%~x1" == %%b goto DJVUfile
rem ___Other____________________________________
for %%b in (".IPA") Do if /i "%~x1" == %%b goto IPAfile
for %%b in (".APK") Do if /i "%~x1" == %%b goto APKfile
for %%b in (".PPTX" ".PPSX") Do if /i "%~x1" == %%b goto PPTXfile
for %%b in (".XLSM") Do if /i "%~x1" == %%b goto XLSMfile
for %%b in (".MDI") Do if /i "%~x1" == %%b goto MDIfile
for %%b in (".STA") Do if /i "%~x1" == %%b goto STAfile
for %%b in (".WMZ") Do if /i "%~x1" == %%b goto WMZfile
for %%b in (".DWG") Do if /i "%~x1" == %%b goto DWGfile
for %%b in (".RVT" ".RFA") Do if /i "%~x1" == %%b goto RVTfile
for %%b in (".GBR" ".DRL" ".KML" ".GPX" ".KMZ" ".3DS" ".STL" ".DXF" ".DWG" ".OBJ") Do if /i "%~x1" == %%b goto reaConvPro
for %%b in (".PLINK") Do if /i "%~x1" == %%b goto LINKfile
for %%b in (".VLINK") Do if /i "%~x1" == %%b goto VLINKfile
for %%b in (".DVI") Do if /i "%~x1" == %%b goto DVIfile
for %%b in (".MP3" ".FLAC") Do if /i "%~x1" == %%b goto MMediafile
for %%b in (".M4A") Do if /i "%~x1" == %%b goto M4Afile
for %%b in (".AVI" ".MKV" ".MP4" ".M4V" ".MOV" ".WMV" ".FLV" ".MPG" ".WEBM" ".OGV" ".3GP" ".WTV" ".RV") Do if /i "%~x1" == %%b goto VideoTfile
for %%b in (".BIK") Do if /i "%~x1" == %%b goto VideoBIKfile
rem ___Fonts____________________________________
for %%b in (".TTF" ".TTC" ".OTF" ".PFB" ".PFA" ".SFD") Do if /i "%~x1" == %%b goto FONTfile
for %%b in (".FON") Do if /i "%~x1" == %%b goto FONfile
for %%b in (".FNT" ".F04" ".F06" ".F08" ".F11" ".F12" ".F14" ".F16" ".F19" ".F32" ".SpecCHR" ".CH4" ".CH6" ".CH8") Do if /i "%~x1" == %%b goto DOSFNTfile
for %%b in (".PCF") Do if /i "%~x1" == %%b goto PILfile
for %%b in (".BDF") Do if /i "%~x1" == %%b goto BDFfile
Гостей встречают по одёжке, а книжки - по обложке.
Поэтому следующие утилитки нам позволят увидеть обложку или первую страницу электронных документов (что тоже бывает полезно).
Для .PDF и .XPS/.OXPS (как и обещал ранее) можно воспользоваться небольшой, но отлично работающей программой MuPDF. Кстати, тоже умеет извлекать внедрённые картинки и текст.
Аналогично посмотреть первую страницу можно и у .DJVU файлов.
Подойдёт для этих целей программа ddjvu (DjVu decompression utility) которую можно взять из пакета DjVuLibre.
Работает с приемлемой скоростью.
В качестве альтернативы можно воспользоваться программой djvudecode из пакета DjVuSmall.
К сожалению, работает не так шустро как хотелось бы, но пусть будет.
В батник добавлено дополнительное преобразование формата изображения - по моим ощущениям, так работает немного быстрее.
Раз можно посмотреть на пдф-ки, значит можно посмотреть и на .DVI-файлы (это те которые создаются пакетом программ TeX, LaTeX и т.п.)
Поможет в этом деле программа dvipdfmx из пакета MiKTeX (есть portable-версия). Но пакет большой, так что смысл его ставить только если действительно этим занимаетесь. А выдернуть из него только те файлы, которые нужны для утилитки - у меня не вышло.
Дополнительное преобразование через пдф пришлось делать, так как рендер напрямую в пнг выдавал слишком странные результаты.
Что насчёт электронных книг? На их обложки тоже можно посмотреть.
Для книг .FB2 существует программа извлечения изображений из файлов данного формата fb2bin (кстати, её возможно прикрутить к МультиАрку).
Основная сложность в том что файл, который является обложкой, не всегда имеет одно и то же название. Обычно это "cover.jpg", но нередко попадаются книги в которых файл обложки обозван как попало.
Поэтому, использовать fb2bin для просмотра обложек можно, но решение не будет универсальным:
Лично для себя я написал скрипт на Python 3.7, которым возможно определить и извлечь файл, который используется в качестве обложки (например:<coverpage><image l:href="#cb_120092big.jpg"/></coverpage>). Исключение составляют только слишком уж криво составленные книги, где обложка тупо вставлена в основной текст.
скрипт на Python 3.7 для извлечения изображений из FB2-книг.
(14.47 KiB) Downloaded 130 times
В комплекте прилагается картинка, которая подставляется, если обложки у файла нет.
Аналогичная ситуация и с книгами .EPUB.
Вроде обычный zip-архив, но файл с обложкой может располагаться и называться как угодно. Чтоб узнать название необходимо распарсить пару файлов (первый чтоб узнать где находится второй файл, а во втором уже и смерть Кощеева написано какой файл изображения нам нужен). К счастью, на этот раз мне не пришлось вспоминать программирование - я нашёл готовое решение, но тоже на Питоне - epub-thumbnailer.
Теоретически возможно извлекать обложки и из книг .LIT и .MOBI - есть распаковщики этих форматов, но у меня таких файлов почти нет и как и желания писать парсер для извлечения названия нужного файла с обложкой.
Last edited by SlashNet on Sun 13 Feb, 2022 22:02, edited 3 times in total.
Чем наполнены электронные книги? Буквами! Разных форм и размеров, чему способствует разнообразие шрифтов.
Их то и будем разглядывать.
С векторными шрифтами (.TTF, .TTC, .OTF, .PFB) поможет обычный ImageMagick.
Но, как говорится, есть нюанс. Если просто скормить файл шрифта утилите и попросить его сконвертировать в изображение, то на выходе мы получим довольно неплохой результат, но не совсем идеальный:
Что же меня не устраивало в полученном результате? А то что я не вижу кириллицы.
Поэтому батник было решено усложнить, благодаря возможности ImageMagick писать на картинках всякие глупости.
На некотором проценте файлов вместо кириллицы будут всё же отображаться вопросительные знаки, хоть кириллица в шрифте и присутствует.
Виндовские растровые файлы шрифтов .FON тоже можно посмотреть (кстати, не все шрифты с расширением .FON являются таковыми).
В качестве дополнительных утилит пригодились FontForge и bdf2bmp, так как используется двойное преобразование (+ всё тот же ImageMagick для увеличения итоговой картинки в 2 раза, чтоб не щуриться).
Из предыдущего раздела понятно, что смотреть также можно и растровые .BDF файлы (используются в Линуксах)
Небольшим минусом является то что программа bdf2bmp показывает сразу все глифы. Поэтому для объёмных BDF-файлов может сгенерироваться длинная портянка.
Тема гениальная !
Здорово что нашелся энтузиаст который это пилит.
Небольшое пожелание лишь в том, чтобы все скрипты/настройки фара можно было бы скачать одним архивом
В идеале чтобы был репозиторий в ГитХабе.
Для предпросмотра первой страницы файлов DjVu обнаружил утилитку пошустрее: ddjvu из DjVuLibre.
Описание добавил в сообщение выше: viewtopic.php?p=169709#p169709
Просмотр обложек игр для некоторых эмулируемых платформ от Nintendo.
Просматриваемая обложка скачивается с сайта GameTDB c помощью утилитки curl (можно приспособить любую другую аналогичную программку)
Необходимые программы для следующих типов файлов:
NintendoDS (.nds): head, tail
Nintendo3DS (.3ds,.cia) tail, grep, ctrtool (https://github.com/3DSGuy/Project_CTR/releases)
Nintendo GameCube (.gcm) head
Образы дисков для GameCube часто имеют расширение .iso, но это тот же .gcm-файл. Стабильно работающего алгоритма по автоопределению .iso являющегося образом GC-игры пока не придумал.
В тексте командного файла есть комментарии с различными комбинациями параметров скачиваемых изображений
( ⚠ HQ-версия обложки на некоторых играх даёт ощутимую задержку перед отображением).