ABAP 图片压缩

作者:ABAP三叔 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, SD, 开发, 数据工程, 销售分销
ABAP 图片压缩 - 封面图
ABAP 图片压缩 - 封面图

前言

图片上传服务器时,如果原图片过大,会占用服务器过多的资源,加载的时候也会变慢,因此在上传图片时,有必要对图片的大小进行压缩。

代码封装

代码封装在类ZCL_COMMON=>RESIZE_IMAGE方法中

ABAP 图片压缩 - 封面图
ABAP 图片压缩 - 封面图

传入原图片(XSTRIGN类型)、压缩后的最大宽和高,返回压缩后的图片 ( X S TRIGN类型)

代码如下:

METHOD resize_image. DATA:lf_xres TYPE i, lf_yres TYPE i, lf_xres_new TYPE i, lf_yres_new TYPE i, lf_ratio TYPE menge_d. "宽高比,小数. TRY. rv_small = iv_original. DATA(lo_image) = NEW cl_fxs_image_processor( ). DATA(lf_handle) = lo_image->add_image( iv_original ). lo_image->get_info( EXPORTING iv_handle = lf_handle IMPORTING ev_xres = lf_xres ev_yres = lf_yres ).

lf_ratio = lf_xres / lf_yres. IF lf_ratio > 1. "宽比高大 lf_xres_new = nmin( val1 = lf_xres val2 = iv_max_width )."求出新的最大允许宽度 lf_yres_new = lf_xres_new / lf_ratio. ELSE."高比宽大 lf_yres_new = nmin( val1 = lf_yres val2 = iv_max_height )."求出新的最大允许高度 lf_xres_new = lf_yres_new * lf_ratio. ENDIF.

IF lf_xres_new >= lf_xres. lo_image->discard_image( lf_handle ). FREE lo_image. RETURN. ENDIF. lo_image->resize( EXPORTING iv_handle = lf_handle iv_xres = lf_xres_new iv_yres = lf_yres_new ). rv_small = lo_image->get_image( lf_handle ). lo_image->discard_image( lf_handle ). FREE lo_image. CATCH cx_fxs_image_unsupported. CATCH cx_root. ENDTRY. ENDMETHOD.

测试代码

见测试程序ZDEMO_RESIZE_PICTURE

*&---------------------------------------------------------------------**& Report ZDEMO_RESIZE_PICTURE*&---------------------------------------------------------------------**&*&---------------------------------------------------------------------*REPORT zdemo_resize_picture."选择上传文件名DATA(lv_filename) = zcl_common=>get_file_name( iv_filter = '*.JPEG' ).CHECK lv_filename IS NOT INITIAL."打开文件DATA(ls_return) = zcl_common=>upload_file( iv_filename = lv_filename ).IF ls_return-subrc <> 0. MESSAGE '文件打开错误' TYPE 'S' DISPLAY LIKE 'E'. RETURN.ENDIF."字节转xstringDATA(lv_content_ori) = zcl_common=>binary_to_xstring( iv_filelength = ls_return-filelength data_tab = ls_return-data_tab ).CHECK lv_content_ori IS NOT INITIAL."调整图片大小DATA(lv_content_small) = zcl_common=>resize_image( iv_original = lv_content_ori iv_max_height = 500 iv_max_width = 500 )."拆分文件路径DATA(ls_split) = zcl_common=>split_file( lv_filename )."获取保存路径DATA(lv_filename1) = zcl_common=>save_file_dialog( iv_filename = ls_split-filename )."xstring转字节DATA(lt_tab) = zcl_common=>xstring_to_binary( iv_xstring = lv_content_small )."下载图片到本地DATA(rs_return1) = zcl_common=>download_file( iv_filename = lv_filename1 data_tab = lt_tab ).IF rs_return1-type = 'E'. MESSAGE rs_return1-message TYPE 'S' DISPLAY LIKE 'E'. RETURN.ENDIF.

代码逻辑为:从本地选择一个图片,压缩后允许的最大高和宽为500,压缩完后保存到本地.

效果展示:

ABAP 图片压缩 - 封面图
ABAP 图片压缩 - 封面图

可以看出压缩后文件大小由5.8MB减小到了32KB,效果非常明显

总结

完整代码见Github

地址:https://github.com/a87b01c14/ZCL_COMMON.git

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP图片压缩.md」整理生成,仅用于内部技术分享与学习交流。