前言
图片上传服务器时,如果原图片过大,会占用服务器过多的资源,加载的时候也会变慢,因此在上传图片时,有必要对图片的大小进行压缩。
代码封装
代码封装在类ZCL_COMMON=>RESIZE_IMAGE方法中
传入原图片(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,压缩完后保存到本地.
效果展示:
可以看出压缩后文件大小由5.8MB减小到了32KB,效果非常明显
总结
完整代码见Github
地址:https://github.com/a87b01c14/ZCL_COMMON.git