Тема: AHK: Определение размеров изображения в PSD/PSB-файлах
Здравствуйте.
Как возможно определить высоту и ширину фото в папке?
Либо можно пойти альтернативным путём. Измерить размер нужного окна, и если true то делаем что-то.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Как возможно определить высоту и ширину фото в папке?
Либо можно пойти альтернативным путём. Измерить размер нужного окна, и если true то делаем что-то.
Maxfashko, ознакомьтесь с этой темой, добавьте префикс языка в заголовок темы.
Знаком, спасибо.
Можно через gui
gui,add,picture,hwndmypic,c:\kartinka.jpg
controlgetpos,,,width,height,,ahk_id %mypic%
msgbox %width% %height%
fullPath:="c:\Downloads\progress.gif"
oImageFile:=ComObjCreate("WIA.ImageFile"), oImageFile.LoadFile(fullPath)
MsgBox, 262208
, % "format: RGB"(oImageFile.IsAlphaPixelFormat ? "A":"")
, % "width:`t"oImageFile.Width "`nheight:`t"oImageFile.Height
. (oImageFile.IsAnimated ? "`nframes:`t"oImageFile.FrameCount:"")
Можно через gui
gui,add,picture,hwndmypic,c:\kartinka.jpg controlgetpos,,,width,height,,ahk_id %mypic% msgbox %width% %height%
Да можно, способ прост и хорош,но.....
Не читает psd
fullPath:="c:\Downloads\progress.gif" oImageFile:=ComObjCreate("WIA.ImageFile"), oImageFile.LoadFile(fullPath) MsgBox, 262208 , % "format: RGB"(oImageFile.IsAlphaPixelFormat ? "A":"") , % "width:`t"oImageFile.Width "`nheight:`t"oImageFile.Height . (oImageFile.IsAnimated ? "`nframes:`t"oImageFile.FrameCount:"")
Примерно ясно. В документации вычитал это
The Windows Image Acquisition Library v2.0 is only designed to support the PNG, BMP, JPG, GIF and TIFF image formats. It should not be relied upon to support other formats, though they may appear to be supported depending on system configuration.
Мне нужно считывать psd
В общем столкнулся с этой проблемой:
error: 0x8....... invalid class string
перерыл кучу форумов на англ. только там ничего внятного не нашел=(
пробовал подключать Com через #include......безуспешно
С psd не выйдет. Это специальный фотошоповский файл, Windows его не читает.
Windows не читает, АНК читает
Простой скрипт "без рюшек", берет данные из заголовка файлов PSD, и, скорее всего, PSB
Показывает размер включительно до 65535 пикселей по Х или Y
psd := "c:/tmp/test.psd"
file := FileOpen(psd, 0x100)
File.Seek(14)
Y := file.ReadUInt() >> 16
Y := ((Y & 0xFF) << 8) | (Y >> 8)
X := file.ReadUInt() >> 16
X := ((X & 0xFF) << 8) | (X >> 8)
MsgBox % "Ширина - " . X . "`nВысота - " . Y
return
Показывает размер включительно до 65535 пикселей по Х или Y
А если больше?
Больше, думаю, редко используется, это ведь около 4295 Мп.
Редко. Но бывает. Мне интересен код, который будет уметь работать с любыми psd.
Да я, собственно, с сабжем познакомился, только открыв тему.
Сразу почему-то пришла мысль извлечь информацию из заголовка - больше времени ушло на разбирательство с big-endian порядком байтов, чем с поиском информации о формате PSD. (Кстати, мне самому не нравится такое приведение к нормальному виду, наверняка можно улучшить)
alexii, для работы с файлами PSB шириной/высотой до 300000 пикселей переделка скрипта будет минимальна, надо просто не отсекать старшую половину оператором " >> 16 ", а тоже обрабатывать.
Irbis, сделаете?
Следующий код должен работать с любым допустимым разрешением > 65К пикселей по обоим направлениям.
psd := "d:\temp\1.psd"
file := FileOpen(psd, 0x100)
File.Seek(14)
Y := Swap(file.ReadUInt())
X := Swap(file.ReadUInt())
File.Close()
MsgBox % "Ширина - " . X . "`nВысота - " . Y
return
Swap(N)
{
Return ((0xFF0000 & N) >> 8)
|((0xFF000000 & N) >> 24)
|((0xFF00 & N) << 8)
|((0xFF & N) << 24)
}
Или так:
psb := "C:\Users\User\Desktop\Untitled-1.psb"
file := FileOpen(psb, 0x100)
file.Seek(14)
W := H := 0
Loop 4
H := (H << 8)|file.ReadUChar()
Loop 4
W := (W << 8)|file.ReadUChar()
file.Close()
MsgBox % "Ширина - " . W . "`nВысота - " . H
return
teadrinker, по одной им известной логике, создатели формата первым в заголовок поместили высоту изображения (Н)
Хорошо, что хоть спецификацию открыли . В русской WIKI:
Недостатки формата
...
Закрытые спецификации, что мешает полноценной поддержке в других программах.
Я к тому написал, что пример из поста #18, при всех его несомненных достоинствах, выдает W<->H
А, да, точно! Отредактирую.
Существует WinApi-функция для инвертирования порядка байтов 32-битного числа:
psb := "C:\Users\User\Desktop\Untitled-1.psb"
file := FileOpen(psb, 0x100)
file.Seek(14)
H := DllCall("Ws2_32\ntohl", UInt, file.ReadUInt(), UInt)
W := DllCall("Ws2_32\ntohl", UInt, file.ReadUInt(), UInt)
file.Close()
MsgBox % "Ширина - " . W . "`nВысота - " . H
return
Изменил название темы на более подходящее.
Как насчёт Коллекции?
Благодарствую .
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться