Статьи к пособию-самоучителю on-line "Visual Basic с нуля"
Как узнать размеры графического изображения файла GIF , не загружая его. Формат GIF файлов.
Скачать исходник примера InfoGIF
Дата создания 08.06.2005 {Автор 4us}

Продолжаем практический анализ графических форматов.
В данной статье разбирается пример распознавания графического файла GIF, считывание из файла данных о размере его графического изображения. Хотя GIF-формат поддерживает анимированное изображение, т.е сохранение нескольких кадров с параметрами их воспроизведения в одном файле, мы будем рассматривать его как просто статичный графический формат. Простая загрузка Gif-файла в, например, элемент Image не даст нам эффекта аннимации. Для этого надо использовать специальные контролы (бесплатный контрол Gif89a скачать можно отсюда).

Растровый файл GIF (Graphics Interchange Format ).

Графические файлы GIF получили широкое распространение, в особенности при использовании их в Интернет, так как имеют высокую степень сжатия (малые размеры) и возможность покадровой анимации. Одним из главных их недостатков является то, что они могут воспроизводить только 256 цветов, в то время, как BMP или JPG - 16 777 216. Однако нас, практиков, этот теоретический вопрос мало интересует, поэтому перейдем сразу к делу. Если ты работаешь с GIFом, значит он тебя устраивает.

К сожалению, Visual Basic не озаботился предоставлением структур для получения информации файлов GIF, аналогичных структурам BITMAPFILEHEADER и BITMAPINFOHEADER для формата BMP. Поэтому нам придется в ручную выбирать нужную нам информацию из соответствующих байтов файла.
Вся нужная нам информация храниться в заголовке файла, который включает в себя 13 байт. Сейчас используют в основном две версии этого формата GIF87a и GIF89a, о чем нам сообщается в первых шести байтах файла. Именно по этим байтам мы определим, что это GIF. Так как для нас версия не имеет значения, так как мы можем идентифицировать формат по первым трем байтам - GIF. Далее идет как раз то, что нам надо - ширина изображения в байтах 7 и 8 и высота в байтах 9 и 10. Так же как и BMP, эти байты расположены шиворот навыворот (старший байт в младшем) и читать их надо также. Структура заголовка файла GIF89a с размером изображения 385x100 пикселов представлена в нижеследующей таблице:

Информация
Идентификатор GIF
Ширина изображения
Высота изображения
Прочая информация
Номер байта (десятичное)
01
02
03
04
05
06
07
08
09
10
11
12
13
Пример значения (шестнадцат.)
47
49
46
38
39
61
81
01
64
00
D5
00
00

Таким образом, ширина нашего изображения будет равна &H0181=385, а высота &H0064=100. Все очень просто. Тем не менее подробно рассмотрим это на примере. Кто знакомился с предыдущей статьей о BMP, может нижеследующий пример не читать, здесь полная аналогия, только байты другие.

Создадим новый ехе-проект. Положим на него Text1 со свойством Multiline=True и кнопку Command1. К исходнику примера приложен файл GIF, который называется "untitled.gif" размером 14362 байта с графическим изображением 157 x 171 пиксель.Процедуру определения информации из GIF-файла пишем в командной кнопке.

Private Sub Command1_Click()
'Сначала объявим переменные
Dim FileName As String 'имя открываемого файла
Dim TypeOfFile As String 'тип файл (GIF)
Dim b As Byte
Dim RazmW As String 'ширина изображения
Dim RazmH As String 'высота изображения
Dim x As Long
'установим имя файла
FileName = App.Path & "\untitled.gif"

'и откроем его
Open FileName For Binary As #1

'Проверяем, GIF ли это,
' иначе считываемая информация будет неверна. Первые три байта должны
' содержать символы "GIF". Считываем эти 3 байта в переменную TypeOfFile.

TypeOfFile = String(3, " ")
Get #1, , TypeOfFile
'Проверяем, эти cимволы GIF
If TypeOfFile = "GIF" Then

'если да, то выводим в Text1 соответствующий текст
Text1 = "GIF-файл" & vbCrLf
'к сожалению у меня нет информации, как считать размер файла, но это не важно
'можно прекрасно обойтись LOF

Text1 = Text1 & "Размер файла = " & LOF(1) & " bytes" & vbCrLf
'Далее считываем в переменную сначала 8-й, а затем 7-й байты. Десятичное содержимое
' каждого байта (переменной b) переводим в шестнадцатиричное, сохраняя первые нули
' 8 байт=0=00, 7 байт=157=9D, получаем "00" & "9D" ="009D" - это и есть ширина

For x = 8 To 7 Step -1
Get #1, x, b
RazmW = RazmW & String((Len(Hex(b)) - 2) * -1, 0) & Hex(b)
Next x
'выводим ширину в Text1, преобразуя в десятичное число с помощью функции ConvertDec,
' находящейся в модуле (подробно о ней читай в статье "...Перевод из шестнадцатеричной
' системы счисления в десятичную"

Text1 = Text1 & "Ширина изображения = " & ConvertDec(RazmW) & " pixels" & vbCrLf
'аналогично поступаем с высотой
For x = 10 To 9 Step -1
Get #1, x, b
RazmH = RazmH & String((Len(Hex(b)) - 2) * -1, 0) & Hex(b)
Next x
Text1 = Text1 & "Высота изображения = " & ConvertDec(RazmH) & " pixels" & vbCrLf
Else

' если файл начинается не с символов GIF выводим соответствующий текст
Text1 = "Это не GIF-файл"
End If
Close
End Sub


Здесь, как и в прошлой статье я использую функцию ConvertDec(), которая должна находится в модуле этого проекта. Подробно о ней и читай в первой статье части 3 "Шестнадцатеричное представление числа. Перевод из шестнадцатеричной системы счисления в десятичную."

Скачать исходник можно вверху страницы.
Читай в следующей статье - про ужасы JPEG где мы попытаемся получить размеры файла JFIF хоть как-нибудь.

Copyright © 2005 4us




Сайт создан в системе uCoz