AVIF数据流无法保存为图片

文章描述了一个在Python中处理AVIF格式图像时遇到的问题,包括从base64编码的数据解码,保存AVIF图片时引发的UnicodeDecodeError错误,以及如何通过Pillow_Avif库解决保存问题,并将AVIF图片转换为JPEG格式以适应其他场景(如插入Excel表格)的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import base64
from PIL import Image
data = "data:image/avif;base64,AAAAHGZ0eXBhdmlmAAAAAGF2aWZtaWYxbW...."
img_data = data.split(',')[-1]
pic_name = 'image.avif'
# 解码base64 编码的数据
byte_data = base64.b64decode(img_data)
image = Image.open(byte_data)
image.save('image1.avif')

运行会提示:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xea in position 31: invalid continuation byte

将最后两行

image = Image.open(byte_data)

image.save('image1.avif')改为:

with open(pic_name, 'wb') as f:
    f.write(byte_data)
import base64
from PIL import Image
data = "data:image/avif;base64,AAAAHGZ0eXBhdmlmAAAAAGF2aWZtaWYxbW...."
img_data = data.split(',')[-1]
pic_name = 'image.jpg'
# 解码base64 编码的数据
byte_data = base64.b64decode(img_data)
with open(pic_name, 'wb') as f:
    f.write(byte_data)

保存的图片是一张空图片,但是拖到网页中可以打开,无法插入到excel表格中,这个该死的avif应该如何保存啊

PS:已解决,做个记录,忘了好回来看。

import pillow_avif    #pip install pillow-avif-plugin

一定要加pillow_avif 这个包,没有代码直接调用,但是一定要加,否则无法保存avif图片,不知道有没有其他办法。

有的机器上国内镜像还无法下载,换官网 pip install -i https://pypi.org/simple pillow-avif-plugin


picstring = pic[0].split("base64,")[1]
# 将数据流从str转换为bytes二进制格式
binary_data = base64.b64decode(picstring)
print(pic_name)
#保存为.avif本地图片
with open(pic_name, 'wb') as f:
   f.write(binary_data)
try:  # 图片保存容易出问题,跳过问题商品
    print('保存图片')
    #将avif格式图片转换为jpg格式
    pic_name = avif_2_jpg(pic_name)

def avif_2_jpg(pic_name):
    AVIFimg = Image.open(pic_name)
    AVIFimg.save(pic_name.replace("avif", 'jpg'), 'JPEG')
    pic_name = pic_name.replace("avif", 'jpg')
    return pic_name

<img

src="data:image/avif;base64,AAAAHGZ0eXBhdmlmAA。。。2kgEqRaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" height="260" width="260" class="MainPic--mainPic--rcLNaCv">

### Java 中实现 AVIF 图片格式转换 在 Java 中进行 AVIF 图片格式的转换可以通过调用外部工具(如 FFmpeg)或者借助第三方库来完成。以下是两种主要方式: #### 方法一:通过 FFmpeg 进行 AVIF 转换 FFmpeg 提供了强大的多媒体处理能力,支持多种视频和图像格式之间的转换。可以在 Java 应用程序中通过运行命令行的方式调用 FFmpeg。 ##### 使用 ProcessBuilder 执行 FFmpeg 命令 下面是一个基于 `ProcessBuilder` 的示例代码,用于将 PNG 文件转换为 AVIF 格式文件[^1]: ```java import java.io.BufferedReader; import java.io.InputStreamReader; public class AvifConverter { public static void main(String[] args) { try { String inputPath = "input.png"; String outputPath = "output.avif"; // 构建 FFmpeg 命令 ProcessBuilder processBuilder = new ProcessBuilder( "ffmpeg", "-i", inputPath, "-c:v", "libaom-av1", "-cpu-used", "4", outputPath); // 启动进程并等待其结束 Process process = processBuilder.start(); int exitCode = process.waitFor(); // 输出执行结果 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } if (exitCode == 0) { System.out.println("AVIF 转换成功!"); } else { System.err.println("AVIF 转换失败,退出码:" + exitCode); } } catch (Exception e) { e.printStackTrace(); } } } ``` 此代码片段展示了如何利用 FFmpeg 将输入的 PNG 文件转换成 AVIF 格式的输出文件。 --- #### 方法二:使用第三方 Java 库 如果不想依赖于外部工具,可以选择一些专门针对图像处理的 Java 库。然而需要注意的是,目前原生支持 AVIF 编解码功能的纯 Java 库较少。一种可能的选择是结合 JNI 或者其他绑定技术引入 C/C++ 实现的支持。 ##### 示例:使用 JCodec 和 AOM-Lib 绑定 JCodec 是一个开源项目,提供了部分现代编解码器的功能接口。虽然它本身不完全支持 AVIF,但可以尝试扩展以适配特定需求。以下伪代码展示了一个潜在方向: ```java // TODO: 需要实际开发团队补充具体细节 // 参考 https://github.com/jcodec/jcodec 并集成 libaom 功能模块 ``` 由于该路径较为复杂且涉及底层操作,建议优先考虑方法一中的解决方案。 --- #### 性能优化技巧 对于大规模批量处理任务,可采用内存映射文件技术提升效率。例如,在读取大尺寸图片时,可通过 FileChannel 获取 MappedByteBuffer 来减少 I/O 开销[^3]。 ```java import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class MemoryMappedExample { public static void mapFile() throws Exception { try (FileChannel fileChannel = FileChannel.open(Paths.get("large_image.png"), StandardOpenOption.READ)) { long size = fileChannel.size(); // 获取文件大小 MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, size); // 映射到内存 // 对缓冲区的操作逻辑... } } } ``` 上述代码演示了如何高效加载大型图片资源以便进一步加工。 --- #### 关键概念总结 - **无损压缩**:PNG 属于典型的无损压缩格式,能够保持原始质量而不损失任何像素信息[^2]。 - **AVIF 特性**:作为一种新兴标准,AVIF 结合了高效的有损/无损压缩机制以及更优的颜色空间表现力,适合替代传统静态图标的场景应用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值