如何在ArcMap的XSL模板中从SQL Server的VARBINARY(BLOB)字段显示图片?
在ArcMap的XSL信息窗口中显示SQL Server VARBINARY(BLOB)图片
当图片从URL改成SQL Server的VARBINARY类型存储后,直接用原来的<img src="{$pic}"/>肯定行不通——因为BLOB是二进制数据,不是可直接访问的URL。这里有两种可行的方案,我之前帮同事解决过类似的问题,亲测有效:
方案一:在XSL中直接将BLOB转成Base64 Data URI
ArcMap使用的是MSXML的XSLT处理器,支持微软的扩展函数来处理Base64编码。你只需要在XSL模板里做两步:
- 首先在XSL的根元素里声明MSXML的命名空间:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
- 然后修改图片显示的代码,获取BLOB字段并编码成Base64,再构造Data URI:
<xsl:variable name="blobData" select="$theField[FieldName='PIC']/FieldValue"/> <!-- 将二进制BLOB转成Base64字符串 --> <xsl:variable name="base64Pic" select="msxsl:base64encode($blobData)"/> <!-- 构造Data URI,注意替换成你实际的图片MIME类型(比如image/png) --> <img border="0" src="data:image/jpeg;base64,{$base64Pic}" width="200"/>
注意:要根据你存储的图片类型修改data:image/jpeg部分——如果是PNG就改成image/png,GIF改成image/gif,如果不确定图片类型,最好在数据库里加个字段专门存储MIME类型,这样可以动态拼接。
方案二:在数据库层面创建Base64计算列
如果ArcMap的XSL扩展函数因为版本或权限问题无法使用,你可以在SQL Server里创建一个计算列,提前把VARBINARY字段转换成Base64格式的Data URI,这样XSL里就能像原来用URL一样直接引用:
- 执行SQL语句添加计算列(替换
YourTableName为你的表名):
ALTER TABLE YourTableName ADD PIC_Base64 AS CAST( 'data:image/jpeg;base64,' + CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:column("PIC")))', 'VARCHAR(MAX)') AS VARCHAR(MAX))
- 然后在XSL模板里直接引用这个新的计算列:
<xsl:variable name="picBase64" select="$theField[FieldName='PIC_Base64']/FieldValue"/> <img border="0" src="{$picBase64}" width="200"/>
这种方法的好处是不用修改XSL的命名空间和逻辑,对ArcMap版本的兼容性更好,缺点是会占用一些额外的数据库存储空间(不过Base64编码只会比原二进制大33%左右,一般可以接受)。
额外注意事项
- 确保你的VARBINARY字段存储的是完整的图片二进制数据(包括图片文件的文件头,比如JPEG的FF D8开头),如果只存了图片的像素数据,Data URI是无法解析的。
- 如果图片体积很大,Base64编码后的字符串可能会很长,有些旧版本的ArcMap信息窗口可能会有显示延迟或者长度限制,这种情况下建议先在数据库里压缩图片再存储。
内容的提问来源于stack exchange,提问作者O.D.
相关产品推荐
相关产品推荐

