【图片转base64格式、numpy图片转base64相关知识方法】

文章讲述了在Python中,将图片从numpy数组和直接从文件转换为base64格式的区别,强调了图片转为二进制后再编码的重要性。还介绍了JPEG和PNG编码的原理以及图像转二进制的基本流程。

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

图片转base64格式、numpy图片转base64格式的坑

一个误区:同一张图经过保存之后,保存后的图转base64和直接由numpy格式转base64是不一样的

原因是要将图片转为base64编码需要先将图片转为二进制格式,再把二进制格式的图片转换为base64

一般转换流程

图片(.png/.jpg):

  • 利用python内置open函数打开图片文件

  • 获取图片二进制数据

  • 利用base64.b64encode()函数转换为base64格式

    实现代码:

    import base64
    
    def cv2_to_base64(image_path):
        image_data1 = ""
        with open(image_path, 'rb') as file:
            image_data1 = file.read()
        if image_data1:
            return base64.b64encode(image_data1).decode('utf8')
        else:
            return None
    

    numpy数组格式图片(基于opencv):

    • 利用OpenCV库中的cv2.cvtColor函数将一张图像从RGB颜色空间转换为BGR颜色空间。

    • 利用cv2.imencode将np图片数据编码为JPEG格式

    • 利用.tobytes方法将其转换为二进制格式

    • 利用base64.b64encode()函数转换为base64格式

      实现代码:

      import base64
      import cv2
      
      def np_array_to_base64(image):
          img_array = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) #RGB2BGR,用于cv2编码
          encode_image = cv2.imencode(".jpg", img_array)[1] #用cv2压缩/编码,转为一维数组
          byte_data = encode_image.tobytes() #转换为二进制
          base64_str = base64.b64encode(byte_data).decode("ascii") #转换为base64
          return base64_str
      

      补充知识

      1. 图片转base64编码的基本原理

        图片转换为Base64编码的原理主要是将图片的二进制数据按照Base64编码规范进行转换。

        • 将图片的二进制数据按照3个字节为一组进行划分,如果最后不足3个字节,则用0进行填充。

        • 将划分好的每组3个字节转化为4个十六进制的字符,然后将前面不足4个字符的高位补0。

        • 如果转换后的字符串长度不是8的倍数,则在字符串的末尾用’='进行填充,直到字符串长度为8的倍数。

        • 将得到的字符串按照每组6个字符进行划分,不足6个字符的高位补0。

        • 将划分的每个组分别对应到字母表中的字符,生成最终的Base64编码字符串。

        这个过程可以通过编程语言中的库函数轻松实现。需要注意的是,在转换过程中,需要使用图片的二进制数据,并且需要按照Base64编码的规范进行相应的转换和填充。

      2. 图像二进制数据的计算原理是什么

        图片的二进制数据背后的计算原理主要是基于图像的离散傅里叶变换(DFT)。DFT是一种将图像从空间域转换到频域的数学变换,它可以将图像中的像素值映射到频率域上,从而得到频域表示。

        在频域表示中,每个像素点的值都被转换为一个复数,该复数的实部和虚部分别表示该像素点在水平和垂直方向上的频率分量。通过对频域表示进行进一步的处理,可以增强图像的某些特征,或者对图像进行一些操作,如滤波、去噪等。

        在将图像转换为二进制数据时,可以使用阈值分割方法将频域表示中的像素值截断为0或1,从而得到二值化的频域表示。然后将该二值化的频域表示逆变换回空间域,即可得到二进制图像。

        需要注意的是,在将图像转换为二进制数据时,阈值的选择非常重要,因为它直接影响到转换结果的质量和效果。此外,由于DFT计算复杂度较高,因此在实际应用中需要考虑算法效率和图像质量之间的平衡。

      3. 一张jpg图像转二进制的详细流程是什么

        • 读取图像:首先需要使用图像处理库或编程语言中的函数来读取要转换的JPG图片。这个过程会将图片文件加载到内存中,并获取每个像素的RGB值。

        • 灰度化:将彩色图像转换为灰度图像。在JPG格式中,每个像素由三个通道组成,分别是红色、绿色和蓝色(RGB)。灰度化可以将这三个通道的值相加后取平均值,得到一个灰度值,从而将彩色图像转换为黑白图像。

        • 二值化:将灰度图像转换为二值图像。在这一步,需要选择一个阈值,将灰度值高于该阈值的像素设置为1(白色),低于该阈值的像素设置为0(黑色)。这个过程可以使用编程语言或图像处理库中的二值化函数来实现。

        • 存储和传输:将转换后的二进制数据存储到文件或进行传输。在存储时,可以按照一定的格式将所有的像素值写入文件,例如将每个像素值作为一行,或者将所有像素值编码为一个连续的二进制数据流。

        需要注意的是,将JPG图片转换为二进制图片是一种有损压缩方式,会丢失一部分图像信息。因此,在转换过程中需要选择合适的阈值和算法,以在保证压缩效果的同时尽量保留图像的细节和特征。同时,也需要根据实际需求选择合适的存储和传输方式。

      4. 从图片本身出发进行二进制格式转换和从numpy格式出发进行二进制转换的区别在哪?

        • 图像格式和数据结构:JPEG是一种常见的图像格式,通常使用有损压缩算法进行编码。在JPEG编码中,图像被转换为像素值的集合,每个像素点包含RGB三个通道的颜色值。而NumPy三通道矩阵是一个由三个通道组成的矩阵,每个通道包含相应的颜色值。

        • 解码方式:将JPEG图像直接解码为二进制数据是通过使用JPEG解码器将JPEG图像的压缩数据还原为原始的像素值。这个过程会将JPEG图像的二进制表示转换为像素值的集合。而将NumPy三通道矩阵转换为二进制则是将矩阵中的每个像素点的RGB值转换为二进制数据。

        • 数据表示:在JPEG解码后的二进制数据中,每个像素点的RGB值以连续的二进制形式表示。而在NumPy三通道矩阵中,每个像素点的RGB值以三个独立的数组形式存储,需要使用NumPy库进行操作和处理。

        • 应用场景:JPEG图像解码后的二进制数据通常用于图像处理、图像分析、图像识别等应用场景中。而NumPy三通道矩阵转换为二进制后,可以用于机器学习、深度学习等需要使用矩阵运算的场景中。

      5. Python内置 open函数对图片进行二进制编码的原理是?

        • Python内置的open函数可以用来打开各种类型的文件,包括图片文件。当使用open函数打开图片文件时,它会自动识别文件的类型(例如,JPEG、PNG等),并使用相应的解码器来读取文件内容。对于JPEG格式的图片,open函数会使用JPEG解码器来读取文件内容,并将解码后的像素值存储在内存中。同样地,对于PNG格式的图片,open函数会使用PNG解码器来读取文件内容,并将解码后的像素值存储在内存中。解码后的图片格式为二进制图片。

        • **JPEG解码器和PNG解码器的主要区别在于它们所处理的图像格式和编码方式不同。**JPEG解码器主要针对JPEG格式的图像,它采用有损压缩算法(离散余弦变换,DCT),将图像压缩在很小的储存空间,一定程度上会造成图像数据的损伤,可能会产生锯齿状边缘。JPEG解码器可以自定义压缩参数,通常用于网络图片显示,但不适用于显示高清晰度的图像。

        • PNG解码器则主要针对PNG格式的图像,它采用无损压缩算法,能够保留图像的全部信息,并且支持透明效果。PNG解码器可以将图像定义256个透明层次,使图片边缘平滑融合,从而消除图片锯齿边缘。此外,PNG解码器还支持渐进网络传输显示,可以在下载完全前提供基本的图像内容,然后再逐渐清晰起来。

      6. 直接从numpy格式图片转二进制再转base64的编码流程是什么?

        对于一张三通道RGB numpy图片,由于直接转二进制需要其是二维数据,故还需要对其通道进行压缩(RGB三通道相加转灰度值,由(1024,1024,3)->(1024,1024)),获取到图片的像素值,再进行转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值