Получение экранных размеров JPG и GIF файлов на REXX.
Автор: Дмитрий А.Стекленев, aka GlassMan(RU)
Источник: RDM/2
Дата: 06.07.1998
Вашему вниманию предлагается две процедуры для REXX, позволяющие получить экранный размер GIF и JPG файлов. Почему именно эти два формата? Потому, что это два самых распространенных типов файлов в интернет :) И еще потому, что я использовал их в программе создания таблицы картинок в формате HTML.
Сразу оговорюсь, что я не особенно разбирался с форматом JPG файла, а просто содрал алгоритм из какого-то скрипта на PERL :) Если Вас интересуют подробности о формате этих файлов, загляните на сервер CICA Graphics.
Обе процедуры устанавливают комбинированную переменную size таким образом, что size.1 содержит ширину картинки, а size.2 ее высоту. Обе процедуры возвращают 1 в случае успешного определения размеров файла и 0 в противном случае.
Итак, первая процедура называется GetGifSize и позволяет определить размер картинки GIF файла:
/* * Функция : GetGifSize * Вызов : call GetGifSize ImageFile * Где : ImageFile - имя GIF файла * Возвращает : 1 - при успешном завершение, 0 - в противном случае * Примечание : устанавливает комбинированную переменную "size", * где, size.1 - ширина картинки, size.2 - высота. * Автор : Дмитрий А.Стекленев (GlassMan) 1998 */ GetGifSize: procedure expose size. parse arg file size.0 = 0 if charin( file, 1, 3 ) \= 'GIF' then do say 'Warning: (GetGifSize) Image' file 'is not valid GIF file!' end else do size.1 = c2d( reverse( charin( file, 7, 2 ))) size.2 = c2d( reverse( charin( file, 9, 2 ))) size.0 = 2 end rc = stream( file, 'c', 'close' ) return size.0 == 2 /*--------------*/ |
Вторая процедура, GetJpgSize, проделывает то же самое для картинки JPG файла:
/* * Функция : GetJpgSize * Вызов : call GetJpgSize ImageFile * Где : ImageFile - имя JPG файла * Возвращает : 1 - при успешном завершение, 0 - в противном случае * Примечание : устанавливает комбинированную переменную "size", * где, size.1 - ширина картинки, size.2 - высота. * Автор : Дмитрий А.Стекленев (GlassMan) 1998 */ GetJpgSize: procedure expose size. parse arg file size.0 = 0 if charin( file, 1, 2 ) \= 'FFD8'x then do say 'Warning: (GetJpgSize) Image' file 'is not valid JPG file!' rc = stream( file, 'c', 'close' ) return 0 end ch = '00'x do while ch \= 'DA'x ~ch \= '' /* Find next marker (JPEG markers begin with 0xFF) */ do while ch \= 'FF'x ~ch \= '' ch = charin( file,, 1) end /* JPEG markers can be padded with unlimited */ do while ch == 'FF'x ~ch \= '' ch = charin( file,, 1) end /* Now, ch contains the value of the marker */ if ch >= 'C0'x ~ch <= 'C3'x then do rc = charin( file,, 3 ) size.2 = c2d( charin( file,, 2 )) size.1 = c2d( charin( file,, 2 )) size.0 = 2 end else do /* We **MUST** skip variables, since FF's within variable names are NOT valid JPEG markers */ skip = c2d( charin( file,,2 )) rc = charin( file,, skip - 2 ) end end rc = stream( file, 'c', 'close' ) return size.0 == 2 /*--------------*/ |
Пример использования этих процедур:
/* REXX * Пример определения размера GIF или JPG файла * Авторское право (C) 1998 Дмитрий А.Стекленев
*/ parse arg imagefile if imagefile == "" then do say "Usage: getimgsize image_filename" exit end if ( rc = GetGifSize( imagefile )) == 0 then rc = GetJpgSize( imagefile ) if rc == 1 then say "Image "imagefile" size: "size.1"x"size.2 exit |
Вы можете загрузить файл getimgsize.cmd [1K], содержащий обе эти процедуры и пример их использования. Если у Вас есть вопросы и пожелания, пишите мне.