Image - 体积最小的 base64 encode 1*1透明图片,透明背景图片base64编码

背景

前端开发时,有些<img>标签的src属性的值来源于接口,在接口获取结果之前,这个src应该设置为什么呢?

误区:设置为#

有人把src设置为<img src="#" />

这是有问题的,浏览器解析时,遇到#就会去把当前的URL再获取一遍(通常会拿到一个HTML文档,就是当前页面的HTML文档),然后赋值给这个图片,但是图片解析失败,图片就展示了报错。

总结一下,有2个问题:

  1. 当前URL被多加载了一遍,浪费了流量。
  2. 图片展示为加载失败,控制台Console也会提示报错。

image.png

误区:设置为空字符串或不设置

这一点比设置为#好很多,不存在上述问题。

在Mac电脑下,<img>只是个空的占位符,并无异样。但是Windows上、手机上一些浏览器兼容并不好,会出现灰色边框,你需要加个CSS样式补救一下:

img[src=""], img:not([src]) { 
    opacity:0; 
}

一种解决方案:Loading态

在React或Vue中,你可以方便的设置Loading状态,当API请求不成功时,不展示那个<img>标签,请求拿到结果后,再展示<img>。或者预先设置一个“加载中”的图片给<img>

这是现代前端开发都会采用的方案。

另一种解决方案:用 1 * 1 透明图片

如果你有一些原因,不想使用Loading态,那么你可以先给<img>的src用base64编码设置一个 1 * 1 的透明图片,这样就规避了各种样式问题了。

  • 用大小1 * 1就是为了保证够小;
  • 用base64编码就是为了避免多余的网络请求开销;
  • 用透明图片就是为了不影响现有的背景样式,让用户以为这里暂时没东西。

如何最小呢?主要试试PNG、GIF、WEBP格式就可以了(JPG不支持透明)。

欢迎收藏,以后备忘。

GIF(最稳定)

78个字符,不存在兼容性问题。推荐使用。

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">

GIF(最短)

74个字符,但存在兼容性问题,不建议用。

<img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==">

PNG(比较长)

114个字符,太长了,不建议用。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=">

WEBP(比较长)

123个字符,太长了,不建议用。

<img src="data:image/webp;base64,UklGRkIAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAIAAAAAAFZQOCAaAAAAMAEAnQEqAQABAACADiWkAANwAP7/YBgAAAA=">

SVG(不是1*1)

64个字符,使用空白SVG实现,但是SVG不指定大小的话,尺寸不是1*1。

<img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'/%3E">

image.png

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,你可以使用以下代码来将JPEG图片进行Base64编码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/bio.h> #include <openssl/evp.h> char* base64_encode(const unsigned char* buffer, size_t length) { BIO *bio, *b64; FILE* stream; int encodedSize = 4 * ((length + 2) / 3); // 计算编码后的大小 char* base64 = (char*)malloc(encodedSize + 1); stream = fmemopen(base64, encodedSize + 1, "w"); b64 = BIO_new(BIO_f_base64()); bio = BIO_new_fp(stream, BIO_NOCLOSE); bio = BIO_push(b64, bio); BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); // 不添加换行符 BIO_write(bio, buffer, length); BIO_flush(bio); BIO_free_all(bio); fclose(stream); return base64; } int main() { FILE* file = fopen("image.jpg", "rb"); if (!file) { printf("无法打开图片文件\n"); return 1; } fseek(file, 0, SEEK_END); long fileSize = ftell(file); fseek(file, 0, SEEK_SET); unsigned char* buffer = (unsigned char*)malloc(fileSize); if (!buffer) { printf("内存分配失败\n"); fclose(file); return 1; } fread(buffer, fileSize, 1, file); fclose(file); char* base64 = base64_encode(buffer, fileSize); printf("%s\n", base64); free(buffer); free(base64); return 0; } ``` 这段代码使用了OpenSSL库中的BIO函数来进行Base64编码。你需要先安装OpenSSL库,然后使用gcc来编译上述代码: ``` gcc -o base64_encode base64_encode.c -lssl -lcrypto ``` 将图片文件命名为"image.jpg",然后运行编译后的可执行文件"base64_encode",即可得到JPEG图片Base64编码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值