Решил сам. Для этого понадобилось описание стандарта GIF.
http://www.w3.org/Graphics/GIF/spec-gif89a.txtСоздал ФМ.
Входные данные: тип xstring. В такой формат картинка преобразуется в 2 этапа:
1) считывается картинка во внут.табл. типа solix_tab в формате BIN (метод cl_gui_frontend_services=>gui_upload)
2) преобразуется в формат xstring ( ФМ: SCMS_BINARY_TO_XSTRING )
Выходные данные: Таблица типа XSTRING_TABLE
Результат: многостраничный GIF разделяется на кадры, как отдельные картинки. Сохранение на локальный диск сделано для тестирования, чтобы видеть конечный результат.
Далее вывода изображения можно использовать код написанный в шапке темы.
Пример кода:
TOP
Code:
CONSTANTS
: co_graphic_control_ext TYPE x LENGTH 3 VALUE '21F904'
, co_trailer TYPE x LENGTH 1 VALUE '3B'
, co_comment_ext TYPE x LENGTH 2 VALUE '21FE'
, co_image_descriptor TYPE x LENGTH 1 VALUE '2C'
, co_plain_text_ext TYPE x LENGTH 3 VALUE '210112'
, co_application_ext TYPE x LENGTH 3 VALUE '21FF0B'
, co_block_terminator TYPE x LENGTH 1 VALUE '00'
.
* Table constant Convert HEX -> BIT -> Dec
TYPES: BEGIN OF ty_hex_bit_dec,
hex TYPE c LENGTH 1,
bit TYPE char4,
dec TYPE char12,
END OF ty_hex_bit_dec.
TYPES: ty_t_hex_bit_dec TYPE SORTED TABLE OF ty_hex_bit_dec
WITH UNIQUE KEY hex bit dec.
DATA: l_t_hex_bit_dec TYPE ty_t_hex_bit_dec
, l_w_hex_bit_dec LIKE LINE OF l_t_hex_bit_dec
.
* extention
TYPES: BEGIN OF ty_extention,
introducer TYPE x LENGTH 1,
label TYPE x LENGTH 1,
block_data TYPE xstring,
block_terminator TYPE x LENGTH 1,
END OF ty_extention.
TYPES: ty_t_extention TYPE STANDARD TABLE OF ty_extention.
DATA: l_t_extention TYPE ty_t_extention
, l_w_extention LIKE LINE OF l_t_extention
.
* Logical Screen Descriptor
TYPES: BEGIN OF ty_lsd_packed_fields,
packed_fields_hex TYPE x LENGTH 1,
packed_fields_bit TYPE c LENGTH 8,
gct_flag TYPE c LENGTH 1,
cr_bit TYPE c LENGTH 3,
cr_dec TYPE i,
sort_flag TYPE c LENGTH 1,
size_gct_bit TYPE c LENGTH 3,
size_gct_byte TYPE i,
END OF ty_lsd_packed_fields.
DATA: ls_lsd_packed_fields TYPE ty_lsd_packed_fields.
TYPES: BEGIN OF ty_logical_screen_descriptor,
width TYPE x LENGTH 2,
hight TYPE x LENGTH 2,
packed_fields LIKE ls_lsd_packed_fields,
background_color_index TYPE x LENGTH 1,
pixel_aspect_ratio TYPE x LENGTH 1,
END OF ty_logical_screen_descriptor.
DATA: ls_lsd TYPE ty_logical_screen_descriptor.
* Image descriptor
TYPES: BEGIN OF ty_image_packed_fields,
packed_fields_hex TYPE x LENGTH 1,
packed_fields_bit TYPE c LENGTH 8,
lct_flag TYPE c LENGTH 1,
interlace_flag TYPE c LENGTH 1,
sort_flag TYPE c LENGTH 1,
reserved TYPE c LENGTH 2,
size_lct_bit TYPE c LENGTH 3,
size_lct_byte TYPE i,
END OF ty_image_packed_fields.
DATA: ls_image_packed_fields TYPE ty_image_packed_fields.
TYPES: BEGIN OF ty_image_descriptor,
separator TYPE x LENGTH 1,
left TYPE x LENGTH 2,
top TYPE x LENGTH 2,
width TYPE x LENGTH 2,
high TYPE x LENGTH 2,
packed_fields LIKE ls_image_packed_fields,
END OF ty_image_descriptor.
DATA: ls_image_descriptor TYPE ty_image_descriptor.
TYPES: BEGIN OF ty_image,
descriptor LIKE ls_image_descriptor,
lct TYPE xstring,
lzw_code_size TYPE x LENGTH 1,
image_data TYPE xstring,
block_terminator TYPE x LENGTH 1,
END OF ty_image.
TYPES: ty_t_image TYPE STANDARD TABLE OF ty_image.
DATA: l_t_image TYPE ty_t_image
, l_w_image LIKE LINE OF l_t_image
.
* GIF
TYPES: BEGIN OF ty_gif,
signature TYPE x LENGTH 3,
version TYPE x LENGTH 3,
lsd LIKE ls_lsd,
gct TYPE xstring,
t_image LIKE l_t_image,
t_extention LIKE l_t_extention,
terminator TYPE x LENGTH 1,
END OF ty_gif.
DATA: g_w_gif TYPE ty_gif.
DATA: g_lenght TYPE i.
*macros fill table constant Convert HEX -> BIT -> Dec
DEFINE load_hex_bit_dec.
clear: l_w_hex_bit_dec.
l_w_hex_bit_dec-hex = &1.
l_w_hex_bit_dec-bit = &2.
l_w_hex_bit_dec-dec = &3.
insert l_w_hex_bit_dec into table l_t_hex_bit_dec.
END-OF-DEFINITION.
ФМ:
Code:
FUNCTION zparser_gif .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(IM_XSTRING) TYPE XSTRING
*" EXPORTING
*" VALUE(EX_T_GIF) TYPE XSTRING_TABLE
*"----------------------------------------------------------------------
* Table convert hex->bit->dec
load_hex_bit_dec '0' '0000' '0'.
load_hex_bit_dec '1' '0001' '1'.
load_hex_bit_dec '2' '0010' '2'.
load_hex_bit_dec '3' '0011' '3'.
load_hex_bit_dec '4' '0100' '4'.
load_hex_bit_dec '5' '0101' '5'.
load_hex_bit_dec '6' '0110' '6'.
load_hex_bit_dec '7' '0111' '7'.
load_hex_bit_dec '8' '1000' '8'.
load_hex_bit_dec '9' '1001' '9'.
load_hex_bit_dec 'A' '1010' '10'.
load_hex_bit_dec 'B' '1011' '11'.
load_hex_bit_dec 'C' '1100' '12'.
load_hex_bit_dec 'D' '1101' '13'.
load_hex_bit_dec 'E' '1110' '14'.
load_hex_bit_dec 'F' '1111' '15'.
PERFORM parser_gif USING im_xstring
CHANGING g_w_gif.
PERFORM devide_gif USING g_w_gif
CHANGING ex_t_gif.
ENDFUNCTION.