RDM/2 The Russian Electronic Developer Magazine  
RDM/2 Русский электронный журнал разработчика  
ДомойОт редактораПишите намОбратная связьRU/2

Получение экранных размеров JPG и GIF файлов на REXX.

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

06/07/1998, Дмитрий А.Стекленев, aka GlassMan(RU)

---
Интересные ссылки:

---

---
Комментариев к странице: 0 | Добавить комментарий
---
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов


(C) Russian Underground/2