1

Тема: VBScript: работа с графическими файлами

Бесплатный COM-сервер Image Size Component позволяет узнать размеры (dimensions) изображений JPEG, GIF, PNG и BMP, размеры файлов в байтах, а также определить реальный формат (из перечисленных), если файл имеет неверное расширение. Компонент можно скачать здесь, ссылка на скачивание высылается на e-mail. Размер дистрибутива (архив) — порядка 33 Кб.

Пример:

Set objImage = CreateObject("XStandard.Image")
objImage.Load "C:\Temp\test.bmp"
WScript.Echo "Width: " & objImage.Width
WScript.Echo "Height: " & objImage.Height
WScript.Echo "Size: " & objImage.Size ' в байтах
Select Case objImage.Format
    Case 1
        strFormat = "GIF"
    Case 2
        strFormat = "JPEG"
    Case 3
        strFormat = "PNG"
    Case 4
        strFormat = "BMP"
    Case Else
        strFormat = "unknown"
End Select
WScript.Echo "Format: " & strFormat

См. также VBScript: чтение расширенных свойств файлов.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: работа с графическими файлами

Бесплатный COM-сервер JPG IPTC Component считывает и устанавливает 12 строковых свойств ("метаданных") JPG-файлов. Дистрибутив (архив) компонента имеет размер порядка 42 Кб.

IPTC — это стандарт, установленный Newspaper Association of America (NAA) и International Press Telecommunications Council (IPTC). IPTC обеспечивает способы сохранения описательного текста внутри файлов JPG, который может быть распознан различными программами (например, IrfanView). Значения, которые может прочитать и записать компонент (первая цифра — индекс для обработки компонентом, вторая цифра — код стандарта IPTC:

0 - Title 5
1 - Topic [Category] 15
2 - Date 55
3 - City 90
4 - State/Province 95
5 - Country 101
6 - Credit 110
7 - Source 115
8 - Copyright 116
9 - Description [Caption] 120
10 - Author 122
11 - Keywords 25

Последний тег "Keywords" может содержать несколько значений, которые нужно разделять запятыми.

IPTC — не та же самая информация, которую можно увидеть в свойствах файла в Проводнике. Мало того, сохранение этой информации в Проводнике может испортить данные IPTC. С данными IPTC могут правильно работать далеко не все программы. В некоторых случаях, работая таким образом с JPG файлом поочерёдно разными программами, можно даже испортить файл. Примечание: вообще, разные программы могут по-разному работать с JPG. Например, текстовые комментарии GIMP не видны как IPTC и не видны в Проводнике.

Пример:

Set oJPG = CreateObject("jsIPTC.JPGEdit")
Number = oJPG.LoadJPG("c:\temp\test.jpg") ' вернёт -1 в случае ошибки
WScript.Echo "найдено тегов: " & Number
For i = 0 To Number - 1
    WScript.Echo oJPG.Tag(i)
Next
'For Each tag In oJPG.AllTags ' массив значений всех тегов, в т.ч. незаполненных
'    WScript.Echo tag
'Next
'For Each tag In oJPG.TagList ' массив названий тегов
'    WScript.Echo tag
'Next
oJPG.Tag(0) = "Заголовок"
oJPG.Tag(1) = "Категория"
success = oJPG.SaveJPG(oJPG.CurrentFile) ' сохранять нужно в тот же файл
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

3

Re: VBScript: работа с графическими файлами

Обработка графического файла посредством компонента WIA

Описание: Windows Image Acquisition Automation Layer.
Ссылка на загрузку библиотеки «Windows Image Acquisition Library v2.0» и SDK: Download details: Windows® Image Acquisition Automation Library v2.0 Tool: Image acquisition and manipulation component for VB and scripting (замечание: сама библиотека изначально наличествует в Windows XP SP1+).

Option Explicit

Const wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"

Dim objImageFile, objImageFile2
Dim objImageProcess
Dim objFSO

Dim strPath2Wallpaper
Dim strPath2MyWallpaper


' Исходный графический файл:
strPath2Wallpaper   = "C:\WINDOWS\Web\Wallpaper\Осень.jpg"
' Графический файл с результатом работы:
strPath2MyWallpaper = "C:\WINDOWS\Web\Wallpaper\MyWallpaper.bmp"

Set objImageFile    = WScript.CreateObject("WIA.ImageFile")
Set objImageProcess = WScript.CreateObject("WIA.ImageProcess")
Set objFSO          = WScript.CreateObject("Scripting.FileSystemObject")

If Not objFSO.FileExists(strPath2Wallpaper) Then
    WScript.Quit 1
End If

With objImageFile
    ' Загружаем файл в компонент:
    .LoadFile strPath2Wallpaper
    
    ' Выводим некоторую информацию об исходном изображении
    WScript.Echo "============================================================"
    WScript.Echo "Image [" & strPath2Wallpaper & "]"
    WScript.Echo "------------------------------------------------------------"
    WScript.Echo "Width                 :", .Width
    WScript.Echo "Height                :", .Height
    WScript.Echo "Depth                 :", .PixelDepth
    WScript.Echo "Horizontal resolution :", .HorizontalResolution
    WScript.Echo "Vertical resolution   :", .VerticalResolution
    WScript.Echo "Frame(s) count        :", .FrameCount
    
    If .IsAnimated Then
        WScript.Echo "Image is animated"
    End If
    
    If .Properties.Exists("40091") Then
        WScript.Echo "Title                 :", .Properties("40091").Value.String
    End If
    
    WScript.Echo "------------------------------------------------------------"
End With

' Обрабатываем…
With objImageProcess
    ' ---------------------------------------------------------------------------
    ' Масштабируем:
    ' ---------------------------------------------------------------------------
    .Filters.Add .FilterInfos("Scale").FilterID
    
    With .Filters.Item(1).Properties
        ' Ширина - 1024 пикселей
        .Item("MaximumWidth")  = 1024
        ' Высота - 768 пикселей
        .Item("MaximumHeight") = 768
    End With
    ' ---------------------------------------------------------------------------
    
    ' ---------------------------------------------------------------------------
    ' Вращаем:
    ' ---------------------------------------------------------------------------
    .Filters.Add .FilterInfos("RotateFlip").FilterID
    ' Отразим зеркально по горизонтали
    .Filters.Item(2).Properties.Item("FlipHorizontal") = True
    ' Отразим зеркально по вертикали
    .Filters.Item(2).Properties.Item("FlipVertical")   = True
    ' Повернём на 270 градусов (по часовой стрелке)
    .Filters.Item(2).Properties.Item("RotationAngle")  = 270
    ' ---------------------------------------------------------------------------
    
    ' ---------------------------------------------------------------------------
    ' Обрезаем:
    ' ---------------------------------------------------------------------------
    .Filters.Add .FilterInfos("Crop").FilterID
    
    With .Filters(3).Properties
        ' Подрежем сверху-снизу
        .Item("Top")    = objImageFile.Width \ 4
        .Item("Bottom") = objImageFile.Width \ 4
        ' Подрежем справа-слева
        '.Item("Left")   = objImageFile.Height \ 10
        '.Item("Right")  = objImageFile.Height \ 10
    End With
    ' ---------------------------------------------------------------------------
    
    ' ---------------------------------------------------------------------------
    ' Наклеим другую картинку:
    ' ---------------------------------------------------------------------------
    .Filters.Add .FilterInfos("Stamp").FilterID
    
    ' Загружаем картинку в новый компонент:
    Set objImageFile2 = WScript.CreateObject("WIA.ImageFile")
    objImageFile2.LoadFile "C:\WINDOWS\Web\exclam.gif"
    
    With .Filters(4).Properties
        ' Наклеиваем картинку…
        .Item("ImageFile") = objImageFile2
        
        ' …в указанном месте
        .Item("Top")       = 20
        .Item("Left")      = 20
    End With
    
    Set objImageFile2 = Nothing
    ' ---------------------------------------------------------------------------
    
    ' ---------------------------------------------------------------------------
    ' Конвертируем:
    ' ---------------------------------------------------------------------------
    .Filters.Add .FilterInfos("Convert").FilterID
    ' В bitmap формат
    .Filters.Item(5).Properties.Item("FormatID").Value = wiaFormatBMP
    ' ---------------------------------------------------------------------------
    
    ' Применяем заданные выше фильтры:
    Set objImageFile = .Apply(objImageFile)
End With

' Перезаписывать существующий файл компонент не умеет,
' потому предварительно проверяем наличие файла…
If objFSO.FileExists(strPath2MyWallpaper) Then
    ' …и, если найден, — удаляем его
    objFSO.DeleteFile strPath2MyWallpaper
End If

' Сохраняем файл:
objImageFile.SaveFile "C:\WINDOWS\Web\Wallpaper\MyWallpaper.bmp"

Set objFSO          = Nothing
Set objImageProcess = Nothing
Set objImageFile    = Nothing

WScript.Quit 0

4

Re: VBScript: работа с графическими файлами

Примеры работы с библиотекой GFLAx:

* WSH: разбиение/склейка изображений;
* VBScript: вывод текста поверх обоев Рабочего стола.

5

Re: VBScript: работа с графическими файлами

Связанная тема: JScript: Распознавание текста в TIF файлах средствами MS Office.