Как изменить разрешение изображения посредством ABAP?

Даже для специфических требований, рождающихся в результате автоматизации какой-либо бизнес-функции предприятия, в системе SAP есть стандартное решение. Одно из таких требований может быть применено, скажем, к изображениям, в частности, к их разрешению. В этой заметке немного текста про то, как изменить разрешение изображения посредством ABAP. И да, слова "стандарт" и "ABAP" могут присутствовать в одном предложении, так как любимое многими функциональными консультантами определение "стандарт" имеет место быть не только в контексте настроек.

Постановка вопроса

Перед вами поставлена задача: для всех загружаемых в систему SAP изображений изменять разрешение до каких-то определенных значений (при условии, что исходное изображение превышает эти самые определенные значения). Как быть?

Решение вопроса

Сразу стоит отметить, что для решения данной задачи возможны варианты. В этой заметке, инструментом для решения выше поставленной задачи будет являться SAP IGS (Internet Graphics Server)

См.  Internet Graphics Service

Purpose
The Internet Graphics Service (IGS) constitutes the infrastructure to enable the application developers to display graphics in an Internet browser with a minimum of effort. The IGS has been integrated in the different SAP UI technologies from HTML GUI to Web Dynpro ABAP/Java and provides a server architecture where data from an SAP system or another source can be used to generate graphical or non-graphical output.

Until SAP Web Application Server 6.20, the IGS has been available only as standalone engine. The standalone IGS is a Windows 32 bit application that runs standalone on a Windows machine and which is connected against several systems.

As of SAP Web AS 6.40, IGS is additionally available as integral part of the SAP Web AS and will be installed with every SAP Web AS installation.

The integrated IGS exists on every SAP Web AS machine and is started and stopped with SAP Web AS. However, IGS is not part of the kernel which means it has to be patched separately.

Для его установки и последующей настройки следует обратиться к специалистам BASIS, ну или проштудировать какое-то количество справочного материала. Проверить, активен ли этот инструмент в вашей системе можно посредством запуска программы GRAPHICS_IGS_ADMIN, либо через запуск транзакции RSRT

См.  IGS Administration with TA SIGS/Report GRAPHICS_IGS_ADMIN

Возвращаюсь к теме этой заметке. Далее будет приведен пример изменения разрешения изображения. Все очень просто.

Допустим, у меня есть изображение следующего разрешения

Мне необходимо изменить ее разрешение до значений 1024 x 768. Соответствующий abap код


REPORT zdemo_igs.
 
DATA: lv_path         TYPE string,
      photo_out       TYPE string,
      lv_str          TYPE string,
      lv_handle       TYPE i,
      lv_buff         TYPE xstring,
      lv_len          TYPE i,
      lt_bin          TYPE sdokcntbins,
      image_processor TYPE REF TO cl_fxs_image_processor.
 
 
lv_str = 'C:\temp\photo\photo_big.jpg'.
 
photo_out = 'C:\temp\photo\photo_small.jpg'.
 
CALL METHOD cl_gui_frontend_services=>gui_upload
  EXPORTING
    filename   = lv_str
    filetype   = 'BIN'
  IMPORTING
    filelength = lv_len
  CHANGING
    data_tab   = lt_bin
  EXCEPTIONS
    OTHERS     = 1.
IF sy-subrc <> 0.
ENDIF.
 
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
  EXPORTING
    input_length = lv_len
  IMPORTING
    buffer       = lv_buff
  TABLES
    binary_tab   = lt_bin
  EXCEPTIONS
    failed       = 1
    OTHERS       = 2.
IF sy-subrc <> 0.
 
ENDIF.
 
CREATE OBJECT image_processor.
TRY.
    lv_handle = image_processor->add_image( lv_buff ).
  CATCH cx_root.
 
ENDTRY.
TRY.
 
    CALL METHOD image_processor->resize
      EXPORTING
        iv_handle = lv_handle
        iv_xres   = 1024
        iv_yres   = 768
      EXCEPTIONS
        OTHERS    = 1.
    IF sy-subrc = 0.
      lv_buff = image_processor->get_image( lv_handle ).
    ELSE.
      "smth
    ENDIF.
 
  CATCH cx_root.
    "smth
ENDTRY.
 
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
  EXPORTING
    buffer        = lv_buff
  IMPORTING
    output_length = lv_len
  TABLES
    binary_tab    = lt_bin.
lv_str = photo_out.
CONDENSE lv_str.
 
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    bin_filesize = lv_len
    filename     = lv_str
    filetype     = 'BIN'
  CHANGING
    data_tab     = lt_bin
  EXCEPTIONS
    OTHERS       = 1.
IF sy-subrc <> 0.
ENDIF.

Тестирую

В результате выполнения метода RESIZE класса CL_FXS_IMAGE_PROCESSOR вы получаете изображение меньшего разрешения, ну и как следствие, меньшего размера.