1

Тема: VBS: Получить размеры изображения

Как узнать размеры  изображения в пикселях средствами vbs?

2 (изменено: Flasher, 2014-10-29 05:42:59)

Re: 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 & ":"

3

Re: VBS: Получить размеры изображения

Спасибо.

4

Re: VBS: Получить размеры изображения

Позволил себе немного изменить код, который предложил 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
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: Получить размеры изображения

Xameleon пишет:

Решение очень удачное.

На XP 26 вместо 31 (может, не везде).

Xameleon пишет:

Как вариант, можно ещё через WIA

Вариант тоже не для XP.

6

Re: VBS: Получить размеры изображения

Flasher

Flasher пишет:

На XP 26 вместо 31 (может, не везде).

Ага. Вспомнил было дело.

Flasher пишет:

Вариант тоже не для XP.

Ну, автор не уточнял под что пишем. Сюрприз будет.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

7

Re: VBS: Получить размеры изображения

Xameleon пишет:

Ну, автор не уточнял под что пишем. Сюрприз будет.

Стремление к работоспособности на большинстве машин не мотивирует?

В первом варианте я бы всё же проверку добавил.
Либо по наличию " x " либо по "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion" > 5.1.

8

Re: VBS: Получить размеры изображения

Flasher пишет:

На XP 26 вместо 31 (может, не везде).

Предлагаю перебирать свойства, проверяя его имя.

Flasher пишет:

Вариант тоже не для XP.

Для XP. Нужен как минимум SP1.

9

Re: VBS: Получить размеры изображения

Для XP. Нужен как минимум SP1.

Неа. На MSDN - минимум Виста. Проверял на SP3.

10

Re: VBS: Получить размеры изображения

Неа. На MSDN - минимум Виста. Проверял на SP3.

Не всегда верьте MSDN: 1, 2.

+ открыть спойлер

Кстати, загрузка библиотеки из поста по первой ссылке — уже тю-тю.

Вот Вам оттуда же: 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.

11

Re: VBS: Получить размеры изображения

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" некорректно. Надо будет ещё подумать.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

12

Re: VBS: Получить размеры изображения

alexii пишет:

Не всегда верьте MSDN

Не знаю, проверил на 4-х машинах (SP2-SP4 Pro, SP3-2 Pro, SP3 Home), везде выдаёт отсутствие объекта.

Xameleon пишет:

Обнаружил неприятный момент. В Win 7 в строке присутствуют спец символы (на XP не обнаружил), которые не дают сделать преобразование полученных значений к числу.

Обратите внимание на мой пример, я там неспроста привожу значение к строковому типу по CStr.

13

Re: VBS: Получить размеры изображения

Flasher,

Обратите внимание на мой пример, я там неспроста привожу значение к строковому типу по CStr.

Так в том то и дело, что это никак не решает проблему преобразования. Проверьте. Смысла приводить его к CStr нет, так как метод и так возвращает String.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: VBS: Получить размеры изображения

Xameleon
"Стринги" тоже разные бывают. НА 7-ке я проверял давно ещё, т.к. метод не раз применял для своих нужд.

15

Re: VBS: Получить размеры изображения

Flasher, а примерчик "разных стрингов" можно увидеть ? O_o

P.S В VBScript не зря сделали функции VarType и TypeName. Они дают возможность понять с чем Вы работаете.

P.P.S Или вы про другие "стринги" ? Женские в расчёт не берём. Это другая область. O_o

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16

Re: VBS: Получить размеры изображения

Ну, например, c возможностью цикличного перебора:

+ такой vbString
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.: Бывают и мужские.

17

Re: VBS: Получить размеры изображения

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 у Вас возникла в первом примере и в последнем.

Flasher пишет:

P.P.S.: Бывают и мужские. wink

P.S Про мужские стринги тем более лучше умолчим )))

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !