26

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

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

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

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
Skype dmitry_fiveg

29

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

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

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

30

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

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

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

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
Skype dmitry_fiveg

34

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

Malcev пишет:

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

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

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

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
Skype dmitry_fiveg

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
Skype dmitry_fiveg

41

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

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

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

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
Skype dmitry_fiveg

44

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

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

45

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

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

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

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
Skype dmitry_fiveg

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
Skype dmitry_fiveg