Получить размеры файла изображения в файле.bat
У меня есть файл bat, в котором перечислены пути всех изображений в папке с кодом
@echo off
break > infofile.txt
for /f "delims=" %%F in ('dir /b /s *.bmp') do (
echo %%F 1 1 1 100 100 >>infofile.txt
)
Текстовый файл выглядит так
C:\Users\Charles\Dropbox\trainer\temp\positive\rawdata\diags(1).bmp 1 1 1 100 100
C:\Users\Charles\Dropbox\trainer\temp\positive\rawdata\diags(348).bmp 1 1 1 100 100
C:\Users\Charles\Dropbox\trainer\temp\positive\rawdata\diags(353).bmp 1 1 1 100 100
То, что я хочу сделать, это заменить 100 100 в конце на размеры каждого изображения по ширине и высоте. Заранее спасибо.
6 ответов
Вы можете использовать MediaInfo:
@ECHO OFF &SETLOCAL
(for /r %%a in (*.jpg *.bmp *.png) do (
set "width="
set "height="
for /f "tokens=1*delims=:" %%b in ('"MEDIAINFO --INFORM=Image;%%Width%%:%%Height%% "%%~a""') do (
echo(%%~a 1 1 1 %%~b %%~c
)
))>infofile.txt
type infofile.txt
пример вывода:
C:\Users\Private\Pictures\snap001.png 1 1 1 528 384
C:\Users\Private\Pictures\snap002.png 1 1 1 1920 1080
C:\Users\Private\Pictures\snap003.png 1 1 1 617 316
C:\Users\Private\Pictures\snap004.png 1 1 1 1920 1080
C:\Users\Private\Pictures\snap005.png 1 1 1 514 346
C:\Users\Private\Pictures\snap006.png 1 1 1 1920 1080
C:\Users\Private\Pictures\snap007.png 1 1 1 395 429
C:\Users\Private\Pictures\snap008.png 1 1 1 768 566
C:\Users\Private\Pictures\snap009.png 1 1 1 1536 1080
C:\Users\Private\Pictures\snap010.png 1 1 1 1600 480
Вот tooltipInfo.bat (гибрид jscript\bat, который можно использовать как .bat
) который получает информацию о файле tooptip для файла и не требует какого-либо внешнего программного обеспечения:
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
//////
FSOObj = new ActiveXObject("Scripting.FileSystemObject");
var ARGS = WScript.Arguments;
if (ARGS.Length < 1 ) {
WScript.Echo("No file passed");
WScript.Quit(1);
}
var filename=ARGS.Item(0);
var objShell=new ActiveXObject("Shell.Application");
/////
//fso
ExistsItem = function (path) {
return FSOObj.FolderExists(path)||FSOObj.FileExists(path);
}
getFullPath = function (path) {
return FSOObj.GetAbsolutePathName(path);
}
//
//paths
getParent = function(path){
var splitted=path.split("\\");
var result="";
for (var s=0;s<splitted.length-1;s++){
if (s==0) {
result=splitted[s];
} else {
result=result+"\\"+splitted[s];
}
}
return result;
}
getName = function(path){
var splitted=path.split("\\");
return splitted[splitted.length-1];
}
//
function main(){
if (!ExistsItem(filename)) {
WScript.Echo(filename + " does not exist");
WScript.Quit(2);
}
var fullFilename=getFullPath(filename);
var namespace=getParent(fullFilename);
var name=getName(fullFilename);
var objFolder=objShell.NameSpace(namespace);
var objItem=objFolder.ParseName(name);
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb787870(v=vs.85).aspx
WScript.Echo(fullFilename + " : ");
WScript.Echo(objFolder.GetDetailsOf(objItem,-1));
}
main();
Вывод, если используется против картинки:
C:\TEST.PNG :
Item type: PNG image
Dimensions: ?871 x 836?
Size: 63.8 KB
так что вы можете:
for /f "delims=? tokens=2" %%a in ('toolTipInfo.bat C:\TEST.PNG ^|find "Dimensions:"') do echo %%a
РЕДАКТИРОВАТЬ: Другой способ с объектом WIA.ImageFile - imgInfo.bat
Я не уверен, сможете ли вы получить такие свойства файла в пакетном скрипте. Я бы порекомендовал использовать что-то вроде Python. Вот ссылка на другой поток, который предлагает использовать для этого библиотеку PIL.imaging.
Если вы заинтересованы в изучении этого маршрута, но не знаете Python, дайте мне знать, и я могу составить быстрый сценарий для этого.
Инструкция по установке Python
Как уже говорилось, для этого вам нужно будет установить Python. Я также обнаружил, что PIL является сторонней библиотекой, поэтому вам также необходимо загрузить и установить ее (убедитесь, что вы выбрали ту же версию, что и у вашей установки python, например, если вы установили Python 2.7 на 64-битной системе, вам потребуется " Подушка-2.1.0.win-amd64-py2.7.exe " отсюда).
После завершения установки вы можете убедиться, что это работает, открыв командную строку (cmd) и введя c:\python27\python.exe
(если вы добавите c:\python27 к верхней части переменной окружения PATH, вам просто нужно будет набрать "Python"). Это откроет командную строку python. Тип print "test"
и вы должны увидеть выходные данные exit()
,
После установки Python вы можете создать скрипт. Вот некоторый код, который будет делать то, что вы запросили (перечислить все файлы с заданным расширением, найденные по базовому пути с шириной 1 1 1 в файл).
Откройте текстовый редактор, например, вставьте блокнот в приведенный ниже код и сохраните его как "image_attr.py" или любое другое имя, которое вы решите использовать:
from PIL import Image
import os, sys
def main():
# if a cmd line arg has been passed in use as base path...
if len(sys.argv) > 1:
base_path = sys.argv[1]
# else use current working dir...
else:
base_path = os.getcwd()
# image file extensions to be included, add or remove as required...
ext_list = ['.bmp', '.jpg']
# open output file...
outfile = os.path.join(base_path,'infofile.txt')
file_obj = open(outfile, 'wb')
# walk directory structure...
for root, dirs, files in os.walk(base_path):
for f in files:
# check of file extension is in list specified above...
if os.path.splitext(f)[1].lower() in ext_list:
f_path = os.path.join(root, f)
width, height = Image.open(f_path).size
output = f_path + ' 1 1 1 ' + str(width) + ' ' + str(height) +'\r\n'
file_obj.write(output)
file_obj.close()
if __name__ == '__main__':
main()
Сохраните это и запомните путь к файлу, я буду использовать c:\python27\image_attr.py
для этого примера. Затем вы можете вызвать это из cmd или из пакетного сценария, передавая аргумент для базового пути, например:
python c:\python27\image_attr.py E:\Users\Prosserc\Pictures
Обратите внимание, что любые аргументы с пробелами в них должны быть заключены в двойные кавычки.
Пожалуйста, дай мне знать, если возникнут какие-либо вопросы.
РЕДАКТИРОВАТЬ
Для Python 3 поправки должны быть минимальными в теории. В этом случае я записываю вывод на экран, а не в файл, но перенаправляю в файл из cmd:
from PIL import Image
import os, sys
def main():
# if a cmd line arg has been passed in use as base path...
if len(sys.argv) > 1:
base_path = sys.argv[1]
# else use current working dir...
else:
base_path = os.getcwd()
# image file extensions to be included, add or remove as required...
ext_list = ['.bmp', '.jpg']
# walk directory structure
for root, dirs, files in os.walk(base_path):
for f in files:
# check of file extension is in list specified above...
if os.path.splitext(f)[1].lower() in ext_list:
f_path = os.path.join(root, f)
width, height = Image.open(f_path).size
output = f_path + ' 1 1 1 ' + str(width) + ' ' + str(height) +'\r\n'
print(output)
if __name__ == '__main__':
main()
Звоните с:
python c:\python27\image_attr.py E:\Users\Prosserc\Pictures > infofile.txt
Приведенный ниже код основан на tooltipInfo.bat от npocmaka за исключением того, что я использовал ExtendedProperty() вместо GetDetailsOf ().
@if (@X==@Y) @then
:: Batch
@echo off & setLocal enableExtensions disableDelayedExpansion
(call;) %= sets errorLevel to 0 =%
(
for /f "tokens=1,2 delims=x " %%X in ('
cscript //E:JScript //nologo "%~dpf0" "%~dpf1" %2
') do (set "width=%%X" & set "height=%%Y") %= for /f =%
) || goto end %= cond exec =%
echo("%~nx1": width=%width% height=%height%
:end - exit program with appropriate errorLevel
endLocal & goto :EOF
@end // JScript
// objects
var FSOObj = WScript.CreateObject("Scripting.FileSystemObject"),
objShell = WScript.CreateObject("Shell.Application");
var ARGS = WScript.Arguments;
if (ARGS.length != 1) {
WScript.StdErr.WriteLine("too many arguments");
WScript.Quit(1);
} else if (ARGS.Item(0) == "") {
WScript.StdErr.WriteLine("filename expected");
WScript.Quit(1);
} // if
ExistsItem = function (path) {
return FSOObj.FolderExists(path) || FSOObj.FileExists(path);
} // ExistsItem
getFullPath = function (path) {
return FSOObj.GetAbsolutePathName(path);
} // getFullPath
getParent = function(path) {
var splitted = path.split("\\"), result = "";
for (var s=0; s<splitted.length-1; s++) {
if (s == 0) {
result = splitted[s];
} else {
result = result + "\\" + splitted[s];
} // if
} // for
return result;
} // getParent
getName = function(path) {
var splitted = path.split("\\");
return splitted[splitted.length-1];
} // getName
var filename = ARGS.Item(0),
shortFilename = filename.replace(/^.+\\/, '');
if (!ExistsItem(filename)) {
WScript.StdErr.WriteLine('"' + shortFilename + '" does not exist');
WScript.Quit(1);
} // if
var fullFilename=getFullPath(filename), namespace=getParent(fullFilename),
name=getName(fullFilename), objFolder=objShell.NameSpace(namespace),
objItem;
if (objFolder != null) {
objItem=objFolder.ParseName(name);
if (objItem.ExtendedProperty("Dimensions") != null) {
WScript.Echo(objItem.ExtendedProperty("Dimensions").slice(1, -1));
} else {
WScript.StdErr.WriteLine('"' + shortFilename +
'" is not an image file');
WScript.Quit(1);
} // if 2
} // if 1
WScript.Quit(0);
Установите imagemagick, затем используйте следующее внутри командного файла:
FOR /F "tokens=* USEBACKQ" %%F IN (`magick identify -format "%%wx%%h" %1`) DO (SET dimensions=%%F)
@ECHO result: %dimensions%
Это можно сделать с помощью PowerShell с помощью Wia.ImageFile.
break>infofile.txt
$image = New-Object -ComObject Wia.ImageFile
dir . -recurse -include *.jpg, *.gif, *.png, *.bmp | foreach{
$fname =$_.FullName
$image.LoadFile($fname)
echo ($fname -replace "\\","/" 1 1 1 $image.Width $image.Height)>>infofile.txt
}
Преимущество в том, что у большинства компьютеров Windows есть PowerShell.
Работает медленнее, чем CMD/ пакетные скрипты
Тем не менее, насколько я знаю, CMD/ пакетные сценарии не могут сделать это.