图片处理类 CL_GUI_PICTURE
主要方法 LOAD_PICTURE_FROM_URL(加载图片)
SET_3D_BORDER "设置图片框
SET_DISPLAY_MODE "自适应容器大小(CL_GUI_PICTURE=>ADUST_DESIGN_TURE),
FUNCTION *创建图片URL地址 'DP_CREATE_URL'
*读取WWWDATA表,取得图片对象信息 'WWW_GET_MIME_OBJECT'
1.Tcode: SMW0 保证 有图片MIME类型(设置)
2.绘制屏幕 container容器( TYPE REF TO CL_GUI_CUSTOM_CONTAINER. )
3.使用类 CL_GUI_PICTURE 调用方法 LOAD_PICTURE_FROM_URL
*定义控制和图像对象定义
DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA PICTURE TYPE REF TO CL_GUI_PICTURE.
*初始标志字段定义
DATA INIT.
*如果还未创建定制对象
IF INIT IS INITIAL.
*图片地址字段定义
DATA URL(255).
CLEAR URL.
*创建对象
CREATE OBJECT CONTAINER
EXPORTING CONTAINER_NAME = 'P1'.
CREATE OBJECT PICTURE
EXPORTING PARENT = CONTAINER
EXCEPTIONS ERROR = 1.
IF SY-SUBRC NE 0.
ENDIF.
*定义通用函数取得图片地址
PERFORM LOAD_PIC_DB CHANGING URL.
*显示图片
CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
EXPORTING
URL = URL.
IF SY-SUBRC NE 0.
ENDIF.
*置标志位已初始
INIT = 'X'.
ENDIF.
ENDMODULE.
*获取图片地址通用函数
FORM LOAD_PIC_DB CHANGING P_URL.
DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE.
DATA HTML_TABLE LIKE W3HTML OCCURS 1.
DATA RETURN_CODE LIKE W3PARAM-RET_CODE.
DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE.
DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN.
DATA PIC_DATA LIKE W3MIME OCCURS 0.
DATA PIC_SIZE TYPE I.
REFRESH QUERY_TABLE.
*查询对象数据
QUERY_TABLE-NAME = '_OBJECT_ID'.
*图片对象名称
QUERY_TABLE-VALUE = 'ZGXPNG2'. " SMW0图片命名名称
APPEND QUERY_TABLE.
*读取WWWDATA表,取得图片对象信息
CALL FUNCTION 'WWW_GET_MIME_OBJECT'
TABLES
QUERY_STRING = QUERY_TABLE
HTML = HTML_TABLE
MIME = PIC_DATA
CHANGING
RETURN_CODE = RETURN_CODE
CONTENT_TYPE = CONTENT_TYPE
CONTENT_LENGTH = CONTENT_LENGTH
EXCEPTIONS
OBJECT_NOT_FOUND = 1
PARAMETER_NOT_FOUND = 2
OTHERS = 3.
IF SY-SUBRC EQ 0.
PIC_SIZE = CONTENT_LENGTH.
ENDIF.
*创建图片URL地址
CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'image'
SUBTYPE = CNDP_SAP_TAB_UNKNOWN
SIZE = PIC_SIZE
LIFETIME = CNDP_LIFETIME_TRANSACTION
TABLES
DATA = PIC_DATA
CHANGING
URL = P_URL
EXCEPTIONS
DP_INVALID_PARAMETER = 1
DP_ERROR_PUT_TABLE = 2
DP_ERROR_GENERAL = 3
OTHERS = 4.
ENDFORM.
表 WWWDATA
4.对图片做出处理,更改图片大小等
CALL METHOD PICTURE->SET_DISPLAY_MODE "自适应容器大小,
EXPORTING
DISPLAY_MODE = CL_GUI_PICTURE=>ADUST_DESIGN_TRUE "x
EXCEPTIONS
ERROR = 1
OTHERS = 2 .
CALL METHOD PICTURE->SET_3D_BORDER "设置图片框
EXPORTING
BORDER = 1
EXCEPTIONS
ERROR = 1
OTHERS = 2 .
任意图片都可以达到效果
二、除了使用SMW0上传图片至服务器外,也可以自定义数据库来存储自定义图片,达到更随意的上传和保存
2.1 数据库设计
程序结构
INCLUDE ZTEST_PICLOADTOP.
INCLUDE ZTEST_PICLOADSCR.
INCLUDE ZTEST_PICLOADO01.
INCLUDE ZTEST_PICLOADI01.
INCLUDE ZTEST_PICLOADF01.
START-OF-SELECTION .
PERFORM UPLOAD_PICTURE .
PERFORM SHOW_PICTURE .
END-OF-SELECTION.
CALL SCREEN 0100 .
2.2数据声明部分
TYPES: BEGIN OF TY_PIC,
PIC_DATA(1024) TYPE X, "
END OF TY_PIC.
DATA: PIC_TAB TYPE TABLE OF TY_PIC.
DATA: GS_PIC TYPE ZPIC_SAVE . "参照数据库定义结构
DATA: GC_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER , "图片显示容器
GO_PIC TYPE REF TO CL_GUI_PICTURE." 图片加载对象
DATA: GV_FILELENGTH TYPE I,
URL(256),
RESU TYPE I VALUE 123,
GV_FILENAME TYPE STRING.
DATA OK_CODE TYPE SY-UCOMM .
CONSTANTS:
GC_CON TYPE C LENGTH 3 VALUE 'PIC' .
2.3 选择屏幕部分
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS : P_ID TYPE CHAR10 OBLIGATORY.
PARAMETERS : P_FILE TYPE IBIPPARMS-PATH OBLIGATORY .
SELECTION-SCREEN END OF BLOCK B1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM SELECT_FILE USING P_FILE.
2.4 PBO部分
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STATUS_0100'.
* SET TITLEBAR 'PIC UPLOAD'.
IF GC_CONTAINER IS INITIAL." 对图片对象初始化
CREATE OBJECT GC_CONTAINER
EXPORTING
CONTAINER_NAME = GC_CON.
CREATE OBJECT GO_PIC
EXPORTING
PARENT = GC_CONTAINER.
ENDIF.
CALL METHOD GO_PIC->LOAD_PICTURE_FROM_URL " 加载图片
EXPORTING
URL = URL
IMPORTING
RESULT = RESU.
ENDMODULE.
2.5 FORM部分 ,两级反转,创建URL
FORM SELECT_FILE USING P_FILE. "F4 filename ,上传
CALL FUNCTION 'F4_FILENAME'
IMPORTING
FILE_NAME = P_FILE.
ENDFORM.
FORM UPLOAD_PICTURE .
GV_FILENAME = P_FILE.
DATA LV_BUFFER TYPE XSTRING.
CALL FUNCTION 'GUI_UPLOAD' "上传图片,计算文件长度
EXPORTING
FILENAME = GV_FILENAME
FILETYPE = 'BIN'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
IMPORTING
FILELENGTH = GV_FILELENGTH
* HEADER =
TABLES
DATA_TAB = PIC_TAB[]
* CHANGING
* ISSCANPERFORMED = ' '
EXCEPTIONS
EXCEPTIONS
FILE_OPEN_ERROR = 1
FILE_READ_ERROR = 2
NO_BATCH = 3
GUI_REFUSE_FILETRANSFER = 4
INVALID_TYPE = 5
NO_AUTHORITY = 6
UNKNOWN_ERROR = 7
BAD_DATA_FORMAT = 8
HEADER_NOT_ALLOWED = 9
SEPARATOR_NOT_ALLOWED = 10
HEADER_TOO_LONG = 11
UNKNOWN_DP_ERROR = 12
ACCESS_DENIED = 13
DP_OUT_OF_MEMORY = 14
DISK_FULL = 15
DP_TIMEOUT = 16
OTHERS = 17
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
INPUT_LENGTH = GV_FILELENGTH
IMPORTING
BUFFER = LV_BUFFER
TABLES
BINARY_TAB = PIC_TAB[]
EXCEPTIONS
FAILED = 1
OTHERS = 2.
GS_PIC-ID = P_ID.
GS_PIC-XTRING = LV_BUFFER.
MODIFY ZPIC_SAVE FROM GS_PIC.
IF SY-SUBRC = 0.
MESSAGE '图片已保存到数据库' TYPE 'S'.
ELSE.
MESSAGE '图片保存失败!' TYPE 'E'.
ENDIF.
ENDFORM.
FORM SHOW_PICTURE .
CLEAR PIC_TAB.
SELECT SINGLE * FROM ZPIC_SAVE INTO GS_PIC WHERE ID = P_ID.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
BUFFER = GS_PIC-XTRING
TABLES
BINARY_TAB = PIC_TAB.
CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'IMAGE'
SUBTYPE = 'PNG'
TABLES
DATA = PIC_TAB
CHANGING
URL = URL.
ENDFORM.
实现效果