1

Тема: AHK: Изменить дату съемки картинок

Здравствуйте. Имеется папка с картинками разного формата, желательно учитывать, что путь к папке может меняться, но это не обязательно. Задача: изменить дату съемки всех картинок в свойствах на текущую. Я вижу два способа реализации:
1) Самый идеальный для меня: определение выделенных файлов-картинок и поочередная или массовая смена их дат в свойствах.
2) Парсинг всех папок в папке (ибо там точно всегда-всегда будут только картинки) и поочередная или массовая смена их дат в свойствах.
Для справки, вот скриншот свойств картинки. Курсор стоит на том месте, которое мне нужно изменить:
https://image.prntscr.com/image/4_PoqScuSLu8NvBkQnXXDw.png
Жду ваших советов.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

2

Re: AHK: Изменить дату съемки картинок

Через Gdi+ SetPropertyItem можно.

3

Re: AHK: Изменить дату съемки картинок

FileSetTime.

4

Re: AHK: Изменить дату съемки картинок

svoboden, а вы пробовали?

5

Re: AHK: Изменить дату съемки картинок

Malcev, нет еще, пусть пользователь сам проверит.

6

Re: AHK: Изменить дату съемки картинок

Зачем тогда впустую советовать?

7 (изменено: svoboden, 2017-10-03 18:50:11)

Re: AHK: Изменить дату съемки картинок

Раз не проверял, значит, впустую, да уж. А для чего это команда нужна.

8

Re: AHK: Изменить дату съемки картинок

FileSetTime
Изменяет отметку даты и времени одного или нескольких файлов или папок.
Какую именно отметку времени изменить.
М = время изменения (это значение по умолчанию, если параметр пустой или опущен)
С = время создания
А = время последнего доступа

Как видите параметра даты съёмки там нет.

9 (изменено: belyankin12, 2017-10-03 19:40:05)

Re: AHK: Изменить дату съемки картинок

Malcev, я так понял это одна из библиотек дополнительных, скачал я одну такую, gdip_all.ahk, там нет такой функции. Вообще ничего по property и item нет.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

10 (изменено: svoboden, 2017-10-03 20:25:21)

Re: AHK: Изменить дату съемки картинок

Можно открыть свойства файла:

#Persistent
 #SingleInstance force
 SetBatchLines -1
 
run, Properties "C:\WINDOWS\notepad.exe"
WinWait Свойства:
SendMessage, 0x130C, 3,, SysTabControl321, Свойства:

И кликами вести нужную дату, но это костыль.

11

Re: AHK: Изменить дату съемки картинок

Схожая тема: AHK: Переименование mp3-файлов по tag-маске.

12 (изменено: stealzy, 2017-10-03 21:38:09)

Re: AHK: Изменить дату съемки картинок

belyankin12, полезно знать название того, чего вы хотите менять. Общепринятое название для этого - exif.
Далее задействуем неведомую вам магию: вот и вот.
Как зачастую и оказывается — простейший путь это подключение существующих библиотек и консольных прог (запуск консольных вы можете осилить и сами).
По поводу GDI+ — SetPropertyItem это ф-ия самой библитеки Gdiplus.dll, а не кода обертки gdip_all.ahk. Вот пример использования.

belyankin12 пишет:

я так понял это одна из библиотек дополнительных, скачал я одну такую, gdip_all.ahk, там нет такой функции. Вообще ничего по property и item нет.

Конечно, зачем нам поиск, можно же задать вопрос на форум, пусть кто нибудь поищет за нас !

13

Re: AHK: Изменить дату съемки картинок

ypppu, смотрел в эту сторону, но все застопорилось на том, что я не знаю команды для смены параметра. Т.е. я могу вывести параметр даты съемки через objFolder.GetDetailsOf(objFilename, 12), но изменить его не знаю как.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

14

Re: AHK: Изменить дату съемки картинок

Malcev пишет:

Как видите параметра даты съёмки там нет.

Параметра нет, но его можно добавить.

15

Re: AHK: Изменить дату съемки картинок

Так добавьте, если можно, потом в коллекцию добавите.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Изменить дату съемки картинок

teadrinker, по-моему svoboden собирался добавить параметр в команду языка AutoHotkey, т.е. ему не в коллекцию, а скорее сюда :
https://github.com/Lexikos/AutoHotkey_L

17 (изменено: svoboden, 2017-10-03 22:45:13)

Re: AHK: Изменить дату съемки картинок

stealzy, teadrinker, а что, хотите сказать, что такое нельзя сделать?

18

Re: AHK: Изменить дату съемки картинок

Можно, нужно всего-то пересобрать AutoHotkey.exe. Я, кстати, один раз это делал. Так что пробуйте.
А я попробовал, как Malcev советовал, такое вышло:

imagePath := A_Desktop . "\test.jpg"
dateTime := "2022:01:01 12:00:00"
ChangeDateTimeImageProperty(imagePath, dateTime)
return

ChangeDateTimeImageProperty(imagePath, newDateTimeStr, jpgQuality := 100)  {
   static DateTimeOriginal := 0x9003, PropertyTagTypeASCII := 2
   
   VarSetCapacity(dateTime, size := StrPut(newDateTimeStr, "CP0"), 0)
   StrPut(newDateTimeStr, &dateTime, "CP0")
   
   VarSetCapacity(PropertyItem, 4*2 + A_PtrSize*2, 0)
   NumPut(DateTimeOriginal, PropertyItem)
   NumPut(size, PropertyItem, 4)
   NumPut(PropertyTagTypeASCII, PropertyItem, 8)
   NumPut(&dateTime, PropertyItem, 4*2 + A_PtrSize)
   
   pToken := Gdip_Startup()
   DllCall("gdiplus\GdipLoadImageFromFile", Str, imagePath, PtrP, pBitmap)
   DllCall("gdiplus\GdipSetPropertyItem", Ptr, pBitmap, Ptr, &PropertyItem)
   SplitPath, imagePath, fileName
   Gdip_SaveBitmapToFile(pBitmap, A_Temp . "\" . fileName, jpgQuality)
   Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
   FileMove, % A_Temp . "\" . fileName, % imagePath, 1
}

Нужна библиотека Gdip.ahk.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19 (изменено: belyankin12, 2017-10-03 23:11:44)

Re: AHK: Изменить дату съемки картинок

Использую все тот же gdip_all.ahk. По крайней мере все используемые функции есть в нём, код следующий:


#Include Gdip_All.ahk

path := "C:\Users\Белочка\Desktop\Notes\Screenshot_4.png"
time := "" A_YYYY ":" A_MM ":" A_DD " " A_Hour ":" A_Min ":" A_Sec ""
ChangeDateTimeImageProperty(path, time)
MsgBox, % time
return

Скрипт запускается, срабатывает, вижу дату, но параметр в свойствах не меняется.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

20

Re: AHK: Изменить дату съемки картинок

У меня срабатывает (пробовал на win 10), хотя с кавычками у вас явный перебор.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Изменить дату съемки картинок

Ну путь же в виде строки передается, а с временем вряд-ли проблемы возникнут, msgbox не зря ставил на проверку, время правильное. Windows 7, может быть проблема в самом dllcall, какая у вас версия AHK?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

22 (изменено: teadrinker, 2017-10-03 23:24:50)

Re: AHK: Изменить дату съемки картинок

Только что на Windows 7 проверил, работает. Версия ahk 1.1.26.01 64-bit Unicode.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23 (изменено: belyankin12, 2017-10-03 23:28:13)

Re: AHK: Изменить дату съемки картинок

Юникод, так и думал, минутку...

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

24

Re: AHK: Изменить дату съемки картинок

На 32-бит тоже проверил.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25

Re: AHK: Изменить дату съемки картинок

До этого использовал ANSI, открыл через юникод, теперь хотя бы дата изменения файла обновилась на текущую, а дата съемки все ещё остается пустой.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

26

Re: AHK: Изменить дату съемки картинок

А на ANSI да, почему-то не работает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27 (изменено: belyankin12, 2017-10-03 23:31:53)

Re: AHK: Изменить дату съемки картинок

Это небось особенность dll файла, я уже сталкивался с этим. Хотелось бы конечно на ANSI чтобы работало, но это не приоритет, я даже с помощью юникод не могу добиться цели. Может быть у меня gdip неправильный? Можете свой скопировать в код?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

28

Re: AHK: Изменить дату съемки картинок

В ANSI сработало если заменить

DllCall("gdiplus\GdipLoadImageFromFile", Str, imagePath, PtrP, pBitmap)

на

DllCall("gdiplus\GdipLoadImageFromFile", WStr, imagePath, PtrP, pBitmap)

Так на Unicode тоже работает.
Весь код:

imagePath := A_Desktop . "\test.jpg"
dateTime := A_YYYY ":" A_MM ":" A_DD " " A_Hour ":" A_Min ":" A_Sec
ChangeDateTimeImageProperty(imagePath, dateTime)
return

ChangeDateTimeImageProperty(imagePath, newDateTimeStr, jpgQuality := 100)  {
   static DateTimeOriginal := 0x9003, PropertyTagTypeASCII := 2
   
   VarSetCapacity(dateTime, size := StrPut(newDateTimeStr, "CP0"), 0)
   StrPut(newDateTimeStr, &dateTime, "CP0")
   
   VarSetCapacity(PropertyItem, 4*2 + A_PtrSize*2, 0)
   NumPut(DateTimeOriginal, PropertyItem)
   NumPut(size, PropertyItem, 4)
   NumPut(PropertyTagTypeASCII, PropertyItem, 8)
   NumPut(&dateTime, PropertyItem, 4*2 + A_PtrSize)
   
   pToken := Gdip_Startup()
   DllCall("gdiplus\GdipLoadImageFromFile", WStr, imagePath, PtrP, pBitmap)
   DllCall("gdiplus\GdipSetPropertyItem", Ptr, pBitmap, Ptr, &PropertyItem)
   SplitPath, imagePath, fileName
   Gdip_SaveBitmapToFile(pBitmap, A_Temp . "\" . fileName, jpgQuality)
   Gdip_DisposeImage(pBitmap)
   Gdip_Shutdown(pToken)
   FileMove, % A_Temp . "\" . fileName, % imagePath, 1
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

29

Re: AHK: Изменить дату съемки картинок

Да, теперь дата изменения файла обновляется и на анси, но все ещё дата съемки остается пустой. Я имел ввиду код библиотеки gdip, может быть в нем проблема.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

30

Re: AHK: Изменить дату съемки картинок

Запостите ваш файл для примера.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

31

Re: AHK: Изменить дату съемки картинок

Запостил.

Post's attachments

Screenshot_4.png 16.62 kb, 3 downloads since 2017-10-03 

You don't have the permssions to download the attachments of this post.
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

32

Re: AHK: Изменить дату съемки картинок

teadrinker, плохо, что у jpg заново компрессия происходит.
Можно это обойти таким способом:
https://autohotkey.com/board/topic/1081 … gdi/page-3
Только на современный ahk надо перевести.

33 (изменено: teadrinker, 2017-10-04 00:34:47)

Re: AHK: Изменить дату съемки картинок

А похоже, что png не поддерживает такой способ. Удалось поменять, только переконвертировав в jpg. Malcev, посмотрю.

Post's attachments

Screenshot_4.jpg 34.82 kb, 1 downloads since 2017-10-03 

You don't have the permssions to download the attachments of this post.
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: Изменить дату съемки картинок

Malcev пишет:

плохо, что у jpg заново компрессия происходит.

По-моему, достаточно указать jpgQuality := 75.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: Изменить дату съемки картинок

Не, размер меняется.
А там дело именно в lossless кодировании при повороте картинки.

36

Re: AHK: Изменить дату съемки картинок

Все верно, прописал filecopy со сменой разрешения на jpg и все заработало. Спасибо!

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

37 (изменено: Malcev, 2017-10-04 01:08:51)

Re: AHK: Изменить дату съемки картинок

belyankin12, дату съемки виндовс берет у разных расширений по-разному.
PNG не поддерживает EXIF, и виндовс берет ее значение из  PNG:CreationTime тага.
Так что, наверное, лучше использовать специальные программы типа  Exiftool, которые предусмотрели подобные ситуации, либо парсить и изменять хедеры файлов самому.

38

Re: AHK: Изменить дату съемки картинок

Malcev пишет:

Можно это обойти таким способом:

А ты какой конкретно код имеешь в виду? Дай ссылку на конкретный пост (можно получить, если навести мышь слева внизу поста).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39 (изменено: Malcev, 2017-10-04 01:36:32)

Re: AHK: Изменить дату съемки картинок

https://autohotkey.com/board/topic/1081 … ntry102599
http://www.nullskull.com/articles/20030706.asp
Кстати, виндовс при изменении даты съёмки у Screenshot_4.png уменьшает файл аж в 3 раза.
Интересно за счёт чего?
В более ранней библиотеки эти параметры были учтены:
https://github.com/Drugoy/Autohotkey-sc … Helper.ahk

40

Re: AHK: Изменить дату съемки картинок

По первой ссылке разве не то же самое, что в Gdip.ahk?
По второй можно посмотреть.
Да, уменьшает, но чем более информативный файл, тем меньше сокращение, видимо, оптимизирует как-то.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

41

Re: AHK: Изменить дату съемки картинок

А, вроде разобрался, попозже попробую переписать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

42 (изменено: Malcev, 2017-10-04 02:36:59)

Re: AHK: Изменить дату съемки картинок

teadrinker пишет:

Да, уменьшает, но чем более информативный файл, тем меньше сокращение, видимо, оптимизирует как-то

Ухудшение качества хорошо видно на этой картинке - пропусти ее через скрипт раз 10.
http://lurkmore.so/images/e/ee/Fuckyeah.jpg

43

Re: AHK: Изменить дату съемки картинок

Если качество указать 100%, не сильно меняется, цвет искажается немного.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

44

Re: AHK: Изменить дату съемки картинок

И размер увеличивается в полтора раза.

45

Re: AHK: Изменить дату съемки картинок

Удалось развернуть картинку, но пока только для 32 бит, в 64 надо со смещениями разобраться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

46 (изменено: teadrinker, 2017-10-04 11:36:40)

Re: AHK: Изменить дату съемки картинок

Не, ничего не вышло. То-есть, код вышел, но файл всё равно теряет качество. Вот функция, которая проворачивает файл два раза, на 90 и 270 градусов:

RotateImage(A_Desktop . "\test.jpg")

RotateImage(imagePath)  {
   static EncoderParameterValueTypeLong := 4
       , #EncoderValueTransformRotate90 := 13
       , #EncoderValueTransformRotate270 = 15
        
   hModule := DllCall("LoadLibrary", "str", "gdiplus.dll", Ptr)
   VarSetCapacity(si, 8 + A_PtrSize*2, 0)
   si := Chr(1)
   DllCall("gdiplus\GdiplusStartup", PtrP, pToken, Ptr, &si, Ptr, 0)
   SplitPath, imagePath,, imageDir, ext, nameNoExt
   if !RegExMatch(ext, "i)^J(PG|PEG|PE|FIF)$")  {
      MsgBox, Файлы %ext% не поддерживаются
      Return
   }
   Loop 2  {
      nSize := nListSize := nCount := pCodec := ""
      DllCall("gdiplus\GdipLoadImageFromFile", WStr, imagePath, PtrP, pBitmap)
      
      DllCall("gdiplus\GdipGetImageEncodersSize", UIntP, nCount, UIntP, nSize)
      VarSetCapacity(ci, nSize)
      DllCall("gdiplus\GdipGetImageEncoders", UInt, nCount, UInt, nSize, Ptr, &ci)
      if !(nCount && nSize)
         return -2
      
      Loop, % nCount  {
         sString := StrGet(NumGet(ci, (idx := (48+7*A_PtrSize)*(A_Index-1))+32+3*A_PtrSize), "UTF-16")
         if InStr(sString, "*." ext)  {
            pCodec := &ci+idx
            break
         }
      }

      DllCall("gdiplus\GdipGetEncoderParameterListSize", Ptr, pBitmap, Ptr, pCodec, UintP, nListSize)
      VarSetCapacity(EncoderParameters, nListSize, 0)
      DllCall("gdiplus\GdipGetEncoderParameterList", Ptr, pBitmap, Ptr, pCodec, UInt, nListSize, Ptr, &EncoderParameters)
      NumPut(1, EncoderParameters, 0, "UInt")
      NumPut(1, EncoderParameters, 16 + A_PtrSize, "UInt")
      NumPut(EncoderParameterValueTypeLong, EncoderParameters, 20 + A_PtrSize, "UInt")
      NumPut(A_Index = 1 ? #EncoderValueTransformRotate90 : #EncoderValueTransformRotate270, NumGet(EncoderParameters, 24 + A_PtrSize) + 0, "UInt")
      
      sOutput := ( A_Index = 1 ? A_Temp : imageDir ) . "\" . nameNoExt . ".jpg"
      if A_IsUnicode
         pOutput := &sOutput
      else  {
         VarSetCapacity(wOutput, StrPut(sOutput, "UTF-16")*2, 0)
         StrPut(sOutput, &wOutput, "UTF-16")
         pOutput := &wOutput
      }
      DllCall("gdiplus\GdipSaveImageToFile", Ptr, pBitmap, Ptr, pOutput, Ptr, pCodec, Ptr, &EncoderParameters)
      DllCall("gdiplus\GdipDisposeImage", Ptr, pBitmap)
      imagePath := A_Temp . "\" . nameNoExt . ".jpg"
   }
   DllCall("gdiplus\GdiplusShutdown" , Ptr, pToken)
   DllCall("FreeLibrary", Ptr, hModule)
   
   FileDelete, % A_Temp . "\" . nameNoExt . ".jpg"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

47

Re: AHK: Изменить дату съемки картинок

Не очень понимаю что тут за шаманство, могу сказать что знаю про JPG из практики.
В отличие от PNG этот алгоритм сжатия по определению даёт искажение цветов, даже при настройках 100% качества. Зато при незначительном уменьшении качества значительно уменьшается размер файла. Например снимок экрана 1280x1024:
100%   275 кб;
95% 174 кб;
90% 137 кб.

48

Re: AHK: Изменить дату съемки картинок

ypppu, пытаемся сохранить jpg без потери качества.
teadrinker, твой код работает правильно, сохраняет без потерь, но если длина и ширина картинки кратна 16.

If the following conditions are met, then the transformation will proceed without loss of information:
    The file used to construct the Image object is a JPEG file.
    The width and height of the image are both multiples of 16.
If the width and height of the image are not both multiples of 16, GDI+ will do its best to preserve the image quality when you apply one of the rotation or flipping transformations shown in the preceding list.

https://msdn.microsoft.com/en-us/librar … s.85).aspx
Но у тебя в коде пропала строка о переносе файла - осталась только стирание с TEMP.

49

Re: AHK: Изменить дату съемки картинок

Тут перенос не нужен, тут же файл два раза сохраняется, первый раз в Temp, второй из Temp на место исходного.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder