Как изменить разрешение изображения посредством ABAP?
Даже для специфических требований, рождающихся в результате автоматизации какой-либо бизнес-функции предприятия, в системе SAP есть стандартное решение. Одно из таких требований может быть применено, скажем, к изображениям, в частности, к их разрешению. В этой заметке немного текста про то, как изменить разрешение изображения посредством ABAP. И да, слова "стандарт" и "ABAP" могут присутствовать в одном предложении, так как любимое многими функциональными консультантами определение "стандарт" имеет место быть не только в контексте настроек.
Постановка вопроса
Перед вами поставлена задача: для всех загружаемых в систему SAP изображений изменять разрешение до каких-то определенных значений (при условии, что исходное изображение превышает эти самые определенные значения). Как быть?
Решение вопроса
Сразу стоит отметить, что для решения данной задачи возможны варианты. В этой заметке, инструментом для решения выше поставленной задачи будет являться SAP IGS (Internet Graphics Server)
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 вы получаете изображение меньшего разрешения, ну и как следствие, меньшего размера.