Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вопрос как работать с тегами/ключевыми словами в файлах jpg ? (http://forum.oszone.net/showthread.php?t=245677)

dark-------13 28-10-2012 21:30 2013939

Вопрос как работать с тегами/ключевыми словами в файлах jpg ?
 
Здравствуйте,
Подскажите пожалуйста,как с помощью Powershell работать с тегами/ключевыми словами в файлах jpg ?
Если возможно приведите пример.

Foreigner 28-10-2012 22:20 2013972

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

Не работает :(

Foreigner 28-10-2012 22:39 2013987

dark-------13, Taglib скачал?

Kazun 28-10-2012 22:54 2013998

Модуль 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 ?

Kazun 29-10-2012 14:56 2014305

Get-Exif Chrysanthemum.jpg | Ft Keywords

dark-------13 29-10-2012 15:59 2014346

Команда Get-Exif без проблем выводит значение exif если они есть, в моем случае получается что данные хранятся не в exif, тогда не понятно в какой раздел jpg файла win Seven добавляет ключевые слова .... :(

Kazun 29-10-2012 16:04 2014351

Пример с изображением.

dark-------13 29-10-2012 16:11 2014354

Вот пример - ключевое слово - солнце

Kazun 29-10-2012 16:39 2014377

Код:

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


Kazun 29-10-2012 16:57 2014390

Думаю,чтто это два разных файла.

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


Kazun 29-10-2012 17:18 2014404

$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

Выдает


Код:

Keywords                                                                                                                                                     
--------


Kazun 29-10-2012 17:32 2014423

Вывод в консоли(не в 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, это косяк только кого не понятно ....

Foreigner 29-10-2012 20:20 2014530

У меня тоже работает:
Код:

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 ?

Foreigner 29-10-2012 21:57 2014621

Цитата:

Цитата 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


Kazun 30-10-2012 00:13 2014737

Код:

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
                }
        }
}


Kazun 30-10-2012 13:23 2014998

Код:

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


Foreigner 31-10-2012 00:09 2015457

Видимо причина в названии файлов -- квадратные скобки. Попробуй добавить -LiteralPath в Get-Childitem.

dark-------13 31-10-2012 00:27 2015474

Не помогло :(

Kazun 31-10-2012 08:51 2015614

В скрипте 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 не переносит :(

Kazun 31-10-2012 18:41 2015960

Код:

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.

Время: 15:30.
© OSzone.net 2001-