Тема: VBS: Получить размеры изображения
Как узнать размеры изображения в пикселях средствами vbs?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → VBS: Получить размеры изображения
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как узнать размеры изображения в пикселях средствами vbs?
Option Explicit : Dim Path, Name, Folder, Size, x
Path = "C:\КАРТИНКИ\" : Name = "IMAGE.JPG"
Set Folder = CreateObject("Shell.Application").NameSpace(Path)
Size = CStr(Folder.GetDetailsOf(Folder.ParseName(Name), 31)) : x = InStr(Size, "x")
MsgBox "Ширина: " & Left(Size, x - 2) & vbNewline & "Высота: " & Mid(Size, x + 2),, " Размеры " & Name & ":"
Спасибо.
Позволил себе немного изменить код, который предложил Flasher. Решение очень удачное. Подзабыл о том, что в свойствах присутствуют эти значения.
Option Explicit
Dim sPath, oFile, aTmp
sPath = "C:\Image.jpg"
Set oFile = CreateObject("Scripting.FileSystemObject").GetFile(sPath)
With CreateObject("Shell.Application").NameSpace(oFile.ParentFolder.Path)
aTmp = Split(.GetDetailsOf(.ParseName(oFile.Name),31)," x ")
MsgBox "Ширина: " & aTmp(0) & vbCrlf & "Высота: " & aTmp(1)
End With
Как вариант, можно ещё через WIA
Option Explicit
With CreateObject("WIA.ImageFile")
.LoadFile "C:\Image.jpg"
MsgBox .Width & "x" & .Height
End With
Или
Option Explicit
Dim oImg
Dim oHtmlDoc
Dim lPicWidth
Dim lPicHeight
Set oImg = LoadPicture("C:\Image.jpg")
Set oHtmlDoc = CreateObject("htmlfile")
With oHtmlDoc.parentWindow.screen
lPicWidth = CLng(oImg.Width / 2540 * .deviceXDpi)
lPicHeight = CLng(oImg.Height / 2540 * .deviceYDpi)
End With
MsgBox lPicWidth & "x" & lPicHeight
Решение очень удачное.
На XP 26 вместо 31 (может, не везде).
Как вариант, можно ещё через WIA
Вариант тоже не для XP.
Flasher
На XP 26 вместо 31 (может, не везде).
Ага. Вспомнил было дело.
Вариант тоже не для XP.
Ну, автор не уточнял под что пишем. Сюрприз будет.
Ну, автор не уточнял под что пишем. Сюрприз будет.
Стремление к работоспособности на большинстве машин не мотивирует?
В первом варианте я бы всё же проверку добавил.
Либо по наличию " x " либо по "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion" > 5.1.
На XP 26 вместо 31 (может, не везде).
Предлагаю перебирать свойства, проверяя его имя.
Вариант тоже не для XP.
Для XP. Нужен как минимум SP1.
Для XP. Нужен как минимум SP1.
Неа. На MSDN - минимум Виста. Проверял на SP3.
Неа. На MSDN - минимум Виста. Проверял на SP3.
Кстати, загрузка библиотеки из поста по первой ссылке — уже тю-тю.
Вот Вам оттуда же: Windows Image Acquisition (WIA) (Windows):
Developer Audience
The WIA API is designed for use by C/C++ programmers. Familiarity with the Windows GUI and Component Object Model (COM) interfaces is required.
For developers familiar with Microsoft Visual Basic 6.0, Active Server Pages (ASP), or scripting, WIA provides an automation layer for Windows XP Service Pack 1 (SP1) or later that builds upon and simplifies access to the foundation provided by C/C++. For information about the automation layer, see Windows Image Acquisition Automation Layer.
Note The WIA Automation Layer supersedes Windows Image Acquisition (WIA) 1.0 scripting.
Run-Time Requirements
Applications that use the WIA API require Windows XP or later.
alexii, полезная инфа. Благодарствую.
Flasher,
Стремление к работоспособности на большинстве машин не мотивирует? wink
В первом варианте я бы всё же проверку добавил.
Либо по наличию " x " либо по "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion" > 5.1.
Согласен. Буду исправляться.
Option Explicit
Dim sPath, oFile, i, vTmp
sPath = "C:\Image.jpg"
Set oFile = CreateObject("Scripting.FileSystemObject").GetFile(sPath)
With CreateObject("Shell.Application").NameSpace(oFile.ParentFolder.Path)
For Each i in Array(31,26)
vTmp = .GetDetailsOf(.ParseName(oFile.Name),i)
if InStr(1,vTmp,"x",1) > 0 Then
vTmp = Split(Replace(vTmp," ",""),"x",2)
MsgBox "Ширина: " & vTmp(0) & vbCrlf & "Высота: " & vTmp(1)
Exit For
End if
Next
End With
Решил оформить в виде процедурки. Обнаружил неприятный момент. В Win 7 в строке присутствуют спец символы (на XP не обнаружил), которые не дают сделать преобразование полученных значений к числу. Так что без регулярки для выбора только чисел (за помощь спасибо JSman) не обошлось.
Option Explicit
Dim lWidth
Dim lHeight
GetImageWidth "C:\Image.jpg", lWidth, lHeight
MsgBox "Ширина: " & lWidth & vbCrlf & "Высота: " & lHeight
Sub GetImageWidth(sImagePath,lWidth,lHeight)
Dim i, oFile, oRegExp
Set oFile = CreateObject("Scripting.FileSystemObject").GetFile(sImagePath)
With CreateObject("Shell.Application").NameSpace(oFile.ParentFolder.Path)
Set oRegExp = New RegExp
oRegExp.Global = True
oRegExp.Pattern = "[0-9]+"
For Each i in Array(31,26)
With oRegExp.Execute(.GetDetailsOf(.ParseName(oFile.Name),i))
if .Count = 2 Then
lWidth = CLng(.Item(0))
lHeight = CLng(.Item(1))
Exit Sub
End if
End With
Next
End With
Err.Raise vbObjectError + 1, "GetImageWidth", "Function failed."
End Sub
P.S Хотя конечно проверять по наличию "x" некорректно. Надо будет ещё подумать.
Не всегда верьте MSDN
Не знаю, проверил на 4-х машинах (SP2-SP4 Pro, SP3-2 Pro, SP3 Home), везде выдаёт отсутствие объекта.
Обнаружил неприятный момент. В Win 7 в строке присутствуют спец символы (на XP не обнаружил), которые не дают сделать преобразование полученных значений к числу.
Обратите внимание на мой пример, я там неспроста привожу значение к строковому типу по CStr.
Flasher,
Обратите внимание на мой пример, я там неспроста привожу значение к строковому типу по CStr.
Так в том то и дело, что это никак не решает проблему преобразования. Проверьте. Смысла приводить его к CStr нет, так как метод и так возвращает String.
Xameleon
"Стринги" тоже разные бывают. НА 7-ке я проверял давно ещё, т.к. метод не раз применял для своих нужд.
Flasher, а примерчик "разных стрингов" можно увидеть ? O_o
P.S В VBScript не зря сделали функции VarType и TypeName. Они дают возможность понять с чем Вы работаете.
P.P.S Или вы про другие "стринги" ? Женские в расчёт не берём. Это другая область. O_o
Ну, например, c возможностью цикличного перебора:
arr = Array("a","b")
Set SC = CreateObject("ScriptControl")
SC.Language = "JScript"
SC.AddCode("function VBArraySort(vbarray){return(new VBArray(vbarray).toArray().sort());}")
Set js = SC.Run("VBArraySort",arr)
WScript.Echo js & vbCr & "Подтип: " & VarType(js)
For Each item In js : WScript.Echo item : Next
P.P.S.: Бывают и мужские.
Flasher,
Не согласен с примером. Дело тут совершенно не в "стрингах". В переменной js имеем объект с default свойством ( функцией / методом), вызываемым по умолчанию. VarType обращается к нему и получает "результат". И уже по полученному результату делает вывод о данных. В данном случае, в этой переменной, находится объект JScriptTypeInfo. Его умолчательным методом, если я не ошибаюсь, является метод toString(), который и возвращает строку представляющую текущий объект.
TypeName работает иначе. Она берёт данные о типе содержимого из заголовка переменной Variant, в которой находятся данные (String / Long / Object / ...).
Рассмотрим пример:
Option Explicit
Dim oTest
Set oTest = new cCls
oTest.Value = 1
MsgBox VarType(oTest)
oTest.Value = "test"
MsgBox VarType(oTest)
Set oTest.Value = Me
MsgBox VarType(oTest)
Class cCls
Public Value
Public Default Property Get data
if isObject(Value) Then
Set data = Value
Else
data = Value
End if
End Property
End Class
Таким образом VarType(oTest) может быть любым из возвращаемых типов данных.
Но если возвращаемое значение String, то оно именно String, адекватно опознанный движком скрипта.
И разновидностей у него как таковых нет. Поэтому не совсем понимаю, какая необходимость в CStr у Вас возникла в первом примере и в последнем.
P.P.S.: Бывают и мужские. wink
P.S Про мужские стринги тем более лучше умолчим )))
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться