dark-------13 |
28-10-2012 21:30 2013939 |
Вопрос как работать с тегами/ключевыми словами в файлах jpg ?
Здравствуйте,
Подскажите пожалуйста,как с помощью Powershell работать с тегами/ключевыми словами в файлах jpg ?
Если возможно приведите пример.
|
dark-------13, Попробуй с помощью taglib-sharp
Код:
[void][reflection.assembly]::loadfile("$((gi $profile).directoryname)\libs\taglib-sharp\taglib-sharp.dll")
$tags = [taglib.file]::create("$pwd\1.jpg")
$tags
|
dark-------13 |
28-10-2012 22:33 2013981 |
Не работает :(
|
Модуль PSImage командлет Get-exif:
Get-exif *.JPG | Format-List *
Либо использовать скрипт Get-ImageMetaData.
|
dark-------13 |
29-10-2012 12:51 2014235 |
Спасибо попробую.
|
dark-------13 |
29-10-2012 14:51 2014301 |
Вопрос, а как добраться к ключевым словам - которые в файлах jpg можно дописывать с помощью проводника операционной системы windows 7 ?
|
Get-Exif Chrysanthemum.jpg | Ft Keywords
|
dark-------13 |
29-10-2012 15:59 2014346 |
Команда Get-Exif без проблем выводит значение exif если они есть, в моем случае получается что данные хранятся не в exif, тогда не понятно в какой раздел jpg файла win Seven добавляет ключевые слова .... :(
|
dark-------13 |
29-10-2012 16:11 2014354 |
Вот пример - ключевое слово - солнце 
|
Код:
PS Z:\> Get-Exif "D:\Q5MnZ146.jpg"
Keywords : {солнце}
|
dark-------13 |
29-10-2012 16:46 2014383 |
А у меня так выдает после команды Get-Exif "c:\test\sun.jpg", хотя в свойствах файла смотрю - там есть слово солнце на вкладке подробно/описание/ключевые слова
Код:
LightSource : Auto
FocalLength :
CaptureMode : Standard
FileSource :
ExposureBias :
DateTaken :
Sharpness : Normal
Orientation :
Title :
StarRating :
Height :
Keywords :
Exposuretime :
FocalLength35mm :
Model :
Contrast : Normal
Comment :
ISO :
ExposureMode : Auto
Manufacturer :
Subject :
Artist :
Copyright :
WhiteBalance : Auto
Author :
Flash :
GPS :
Software :
Path : C:\test\sun.jpg
Width :
MaxApperture :
SubjectRange :
ColorSpace :
DigitalZoomRatio :
FNumber :
MeteringMode :
ExposureProgram :
Saturation : Normal
|
Думаю,чтто это два разных файла.
|
dark-------13 |
29-10-2012 17:06 2014395 |
Нет файл один и тот же.
Все разобрался - проблема с модулем была, перезапустил powershell_ISE.exe дал команду import-module image
потом еще раз Get-Exif "c:\test\sun.jpg" и все заработало.
Спасибо вам за помощь уважаемый Kazun.
Блин а вот такой скрипт не работает, и после этого скрипта, даже просто Get-Exif "c:\test\sun.jpg" не отрабатывает как положено keywords не выдает
Код:
import-module image
$in="C:\test\"
$out="C:\test\"
$folder = "$out\res"
Get-ChildItem $in -include *.jpg -Recurse | Get-Image | Get-Exif | format-table keywords
|
$in отсуствует.
Get-ChildItem $in -include *.jpg -Recurse | Get-Exif | format-table keywords
|
dark-------13 |
29-10-2012 17:22 2014410 |
Да спасибо поправил уже, но че-то все равно не пашет
Код:
import-module image
$in="C:\test"
$out="C:\test"
$folder = "$out\res"
Get-ChildItem $in -include *.jpg -Recurse | Get-Image | Get-Exif | format-table keywords
Так убрал лишнее - так работает
Код:
import-module image
$in="C:\test"
Get-ChildItem $in -include *.jpg -Recurse | Get-Image | Get-Exif
Так - не работает
Код:
import-module image
$in="C:\test"
Get-ChildItem $in -include *.jpg -Recurse | Get-Image | Get-Exif | format-table keywords
Выдает
|
Вывод в консоли(не в ISE ):
Get-ChildItem $in -include *.jpg -Recurse | Get-Exif | FT Path,KeyWords
|
dark-------13 |
29-10-2012 19:29 2014498 |
Спасибо вам за помощь Kazun, скрипт работает, и ваш и мой.
Кажется понял из-за чего не появлялись ключевые слова. Дело в том что если повторно запустить импорт import-module image, то после этого ключевые слова не будут выводиться до перезапуска Powershell, это косяк только кого не понятно ....
|
У меня тоже работает:
Код:
Exif : TagLib.IFD.IFDTag
Xmp : TagLib.Xmp.XmpTag
OtherTags : {}
AllTags : {, , }
TagTypes : AudibleMetadata, XMP, JpegComment
Keywords : {солнце}
Rating :
DateTime :
Orientation : None
Software :
Latitude :
Longitude :
Altitude :
ExposureTime :
FNumber :
ISOSpeedRatings :
FocalLength :
FocalLengthIn35mmFilm :
Make :
Model :
Creator :
Title :
Comment : CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 8
Copyright :
TitleSort :
Performers : {}
PerformersSort : {}
AlbumArtists : {}
AlbumArtistsSort : {}
Composers : {}
ComposersSort : {}
Album :
AlbumSort :
Genres : {}
Year : 0
Track : 0
TrackCount : 0
Disc : 0
DiscCount : 0
Lyrics :
Grouping :
BeatsPerMinute : 0
Conductor :
MusicBrainzArtistId :
MusicBrainzReleaseId :
MusicBrainzReleaseArtistId :
MusicBrainzTrackId :
MusicBrainzDiscId :
MusicIpId :
AmazonId :
MusicBrainzReleaseStatus :
MusicBrainzReleaseType :
MusicBrainzReleaseCountry :
Pictures : {}
Artists : {}
FirstArtist :
FirstAlbumArtist :
FirstAlbumArtistSort :
FirstPerformer :
FirstPerformerSort :
FirstComposerSort :
FirstComposer :
FirstGenre :
JoinedArtists :
JoinedAlbumArtists :
JoinedPerformers :
JoinedPerformersSort :
JoinedComposers :
JoinedGenres :
IsEmpty : False
Кроме того taglib-sharp работает не только с изображениями.
|
dark-------13 |
29-10-2012 21:24 2014591 |
А как установить taglib-sharp ?
|
Цитата:
Цитата dark-------13
А как установить taglib-sharp ? »
|
Распаковать архив, куда удобно. В скрипте подгрузить dll и создать экземпляр taglib:
Код:
[void][reflection.assembly]::loadfile("c:\taglib-sharp\taglib-sharp.dll")
$file = gi $args[0]
$tags = [taglib.file]::create($file)
# $tags | gm # посмотреть доступные методы и свойства
$tags.tag.keywords # выдаст "солнце" в твоем случае
Вызывать "script.ps1 .\file.jpg"
|
dark-------13 |
29-10-2012 22:16 2014640 |
Хочу отфильтровать фотки по keywords и не получается делаю так, что я не правильно делаю ? Пробовал ставить так get-image | get-exif | тоже не получается .
Код:
import-module image
$in="e:\test\in"
$out="e:\test\out"
$ExifIDKeywords="40094"
Get-ChildItem $in -include *.jpg -Recurse | get-image | Add-exifFilter -passThru -ExifID $ExifIDKeywords -string "робот" | copy-Item -Destination $out
|
Код:
Get-ChildItem $in -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "робот"} | Foreach {Copy $_.Path -Destination $out}
|
dark-------13 |
30-10-2012 13:10 2014989 |
Спасибо за помощь уважаемые Kazun и Foreigner.
Подскажите пожалуйста, что я делаю неправильно в следующем скрипте:
Как заставить скрипт искать все фотки с заданным параметром exif "небо" и копировать в указанный каталог $dest, с переименованием одинаковых файлов если встретятся ?
Делал и так ? {!$_.path} и вот так ? {$_.path} значение не передается copy-item
Код:
import-module image
$Path="c:\test\in"
$dest="c:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "небо"} | ? {!$_.path} | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
|
Код:
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "небо"} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
|
dark-------13 |
30-10-2012 20:48 2015326 |
Спасибо за помощь уважаемым Kazun(у), и Foreigner(у) в создании данного скрипта
Почуть переделал часть скрипта {$_.Keywords -eq "небо"}, теперь скрипт выглядит вот так - см. ниже, может быть данный скрипт будет еще кому-то полезным:
Код:
#Чтобы скрипт работал нужно скачать и установить модуль ( Image-module powershell ), кратко называется image
#подгружаем установленный модуль командой import-modul
#ДЛЯ СОРТИРОВКИ МОЖНО ИСПОЛЬЗОВАТЬ следующие конструкции Where {($_.Keywords -like "*всп*") -or ($_.Keywords -like "*tot*")}
# Where {($_.Keywords -eq "робот") -or ($_.Keywords -like "total")}
# -or ($_.StarRating -eq "4")}
#если скрипт файлы не переносит значит повторно выполняется команда import-module, а она должна выполняться только один раз после запуска powershell
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
|
dark-------13 |
30-10-2012 23:40 2015434 |
Подскажите пожалуйста почему выдается ошибка при обработке некоторых фотографий ?
Код:
Get-ExifItem : Не удается обработать преобразование аргументов для параметра "image". Не удается преобразовать значение "G:\pics\2009\3\02[1]__56610.jpg" типа "Sy
stem.String" в тип "System.__ComObject".
C:\Users\User_1\Documents\WindowsPowerShell\Modules\image\Get-exif.ps1:146 знак:31
+ $dt = (get-ExifItem -image <<<< $image -ExifID $ExifIDDateTimeTaken)
+ CategoryInfo : InvalidData: (:) [Get-ExifItem], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-ExifItem
Код:
Get-ExifItem : Не удается обработать преобразование аргументов для параметра "image". Не удается преобразовать значение "G:\pics\2009\27\ff_03[1]__49189.jpg" типа "Sy
stem.String" в тип "System.__ComObject".
C:\Users\User_1\Documents\WindowsPowerShell\Modules\image\Get-exif.ps1:142 знак:34
+ $altref = get-ExifItem -image <<<< $image -ExifID $ExifIDGPSAltRef
+ CategoryInfo : InvalidData: (:) [Get-ExifItem], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-ExifItem
|
Видимо причина в названии файлов -- квадратные скобки. Попробуй добавить -LiteralPath в Get-Childitem.
|
dark-------13 |
31-10-2012 00:27 2015474 |
Не помогло :(
|
В скрипте Get-Image.ps1 поправьте строчку:
[ValidateScript({Test-path -LiteralPath $_ })][string]$Path)
и
foreach ($file in (resolve-path -LiteralPath $path) ) {
|
dark-------13 |
31-10-2012 17:42 2015916 |
Не помогло, ошибки перестал выдавать, а файл [sun].jpg не переносит :(
|
Код:
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item -LiteralPath $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path -LiteralPath $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
|
dark-------13 |
31-10-2012 20:57 2016034 |
Спасибо вам уважаемый Kazun все заработало
Вот последняя версия скрипта - выкладываю все в одной форме, может пригодится кому
Код:
#Чтобы скрипт работал нужно скачать и установить модуль ( Image-module powershell ), кратко называется image
#подгружаем установленный модуль командой import-modul
#ДЛЯ СОРТИРОВКИ МОЖНО ИСПОЛЬЗОВАТЬ следующие конструкции Where {($_.Keywords -like "*всп*") -or ($_.Keywords -like "*tot*")}
# Where {($_.Keywords -eq "робот") -or ($_.Keywords -like "total")}
# -or ($_.StarRating -eq "4")}
#если скрипт файлы не переносит значит повторно выполняется команда import-module, а она должна выполняться только один раз после запуска powershell
#чтобы работать с файлами в названии которых присутствуют символы [ или ] используем второй вариат скрипта и измененный файл Get-Image.ps1 из комплекта Image-module powershell
#в файле Get-Image.ps1 были исправлены следующие строки
# [ValidateScript({Test-path -LiteralPath $_ })][string]$Path)
#
# и
#
# foreach ($file in (resolve-path -LiteralPath $path) ) {
<#
# Вариант 1
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*ро*") -or ($_.Keywords -like "*recall*")} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
#>
# Вариант 2
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item -LiteralPath $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path -LiteralPath $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
|
Время: 15:30.
© OSzone.net 2001-