Получение экранных размеров 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], содержащий обе эти процедуры и пример их использования. Если у Вас есть вопросы и пожелания, пишите мне.