如果您的图像是静态的,您可以使用数据步将其嵌入到您的结果中,而无需将文件复制到服务器。
<img src="" />
这样做的技巧是将图像编码为 Base64 编码,然后您可以使用以下神奇的符号将图像嵌入到语句中:
<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 图像转换器”,例如这个。拖放您的图像,它将为您生成 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
选项一起使用。请参阅此处的文档。
另请参阅Don Henderson 的这篇文章,它提供了一种类似的方法来解决这个问题。感谢 Vasilij 提供的链接。