如果您的图像是静态的,您可以使用数据步将其嵌入到结果中,而无需将文件复制到服务器。
这样做的诀窍是将图像编码为 Base64 编码,然后您可以使用这种神奇的符号将图像嵌入到 <img src="" /> 语句中:
<img src="data:image/png;base64,...." />
你可以看到src=属性包含元数据告诉浏览器该值包含图像数据,代表一个png文件(我在测试这篇文章时使用了一个png文件,你可能有一个JPG/BMP等。 ..) 并且该值是使用 base64 编码的。最后的 4 个句点将替换为以 base64 表示法表示的图像数据。这看起来像这样:
<img src="data:image/png;base64,iVBORw0KGgoAAAAN
... much much more base64 content here ...
HSLyz+h9xy+7HbHRL83L1tv9h8+4d/+Ic/Gf8DiYav3mpqHAMAAAAASUVORK5CYII=" />
将图像转换为 base64 很简单。您可以简单地在 Google 上搜索“在线 base64 图像转换器”,例如 this one。拖放您的图像,它会为您生成 base64 代码。
要将其放入 sas 中的数据步中,只需以下情况:
data _null_;
file _webout;
put '<html>';
put '<img src="data:image/png;base64,iVBORw0KGgoAAAAN......etc..." />';
put '</html>';
run;
如果您的图像特别大(例如大于 ~32k),您可能会在尝试从数据步输出图像时遇到问题。我可能需要对此进行测试以澄清。您可以通过从 SAS 文件中读取 base64 图像并将其直接流式传输到 _webout 来解决此问题,使用类似于以下的代码:
data _null_;
file _webout;
infile '\path\to\base64\file.ext';
input;
put _infile_;
run;
如果您想变得非常棘手,您可以拍摄您喜欢的任何图像(例如在 SAS 中生成的图表)并将其即时转换为 base64,然后将其流式传输。下面是一些 SAS 代码,它将获取图像文件并将其转换为 Base64:
data _null_;
length base64_format $20 base64_string $32767;
infile "\your_sasdir\hi.png" recfm=n;
file "\your_sasdir\hi.base64";
input byte $16000. ;
* FORMAT LENGTH NEEDS TO BE 4n/3 ROUNDED UP TO NEAREST MULTIPLE OF 4;
format_length = 4*(lengthn(byte)/3);
mod = mod(format_length,4);
if mod ne 0 then do;
format_length = format_length - mod + 4;
end;
base64_format = cats("$base64x",format_length,".");
base64_string = putc(cats(byte), base64_format);
put base64_string;
run;
这是我用来测试的图片:
转换后,Base64 表示应如下所示:
iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABaSURBVDhP5YxbCsAgDAS9/6XTvJTWNUSIX3ZAYXcdGxW4QW6Khw42Axne81LG0shlRvVVLyeTI2aZ2fcPyXwPdBI8B999NK/gKTaGyxaMX8gTJRkpyREFmegBTt8lFJjOey0AAAAASUVORK5CYII=
我会看看能否找到一种方法来简化这一点,因为这是我们在工作中经常做的事情。
编辑:有趣的是,SAS9.4 似乎支持直接使用ODS HTML5 和inline 选项来执行此操作。请参阅文档here。
另请参阅 Don Henderson 的 this post,它提供了解决此问题的类似方法。感谢 Vasilij 提供的链接。