Python 中图像到字符串的转换及反向转换
当我们谈论“在 Python 中将图像转换为字符串格式并转换回来”时,指的是将图像文件转换为可以使用字符串存储和管理的内容,然后最终将其转换回原始图像格式。
将图像转换为字符串 − 将图像转换为字符串涉及将它们的二进制数据转换为文本格式,以便通过需要基于文本的图像的网络协议进行传输或存储。当使用 API、数据库或通过需要文本数据传输或存储的网络协议发送图像时,此转换方法可以帮助我们更有效地传输或存储图像。
生成的字符串通常由使用特定编码方案(例如 base64 编码)表示的图像二进制数据的表示组成。此方法确保每一段二进制信息都使用 ASCII 字符表示,以便轻松地作为字符串进行传输或存储。
将字符串转换为图像 − 将字符串转换回图像需要将编码的字符串解码回它们的二进制数据表示,使我们能够使用它们的编码表示来重建图像文件。
在本练习中,我们将使用 JPEG 格式的 Tutorialspoint 徽标将其转换为字符串形式,然后使用该字符串形式将其恢复为图像格式。我们将使用以下图像作为输入文件
方法 1:Base64 编码/解码
Base64 编码是一种越来越流行的将二进制数据(如图像)表示为字符串格式的方法。Python 提供其 base64 模块来使用此算法进行编码和解码。
将图像转换为字符串
以下代码以二进制模式读取名为“tpt_logo.jpg”的图像文件,并使用 base64.b64encode() 函数将其内容编码为 base64 字符串,然后使用 write() 方法将其保存到名为 encoded_image.txt 的文本文件中,之后打印一条消息确认它已作为 base64 字符串表示存储在文本文件中,以便将来使用或传输。从本质上讲,此代码将图像转换为 base64 编码的字符串表示,然后保存到文本文件中,以便将来使用或传输。
示例
import base64 # Read image file with open('tpt_logo.jpg', 'rb') as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') # Save the encoded string in a text file with open('encoded_image.txt', 'w') as file: file.write(encoded_string) print("Encoded string saved in 'encoded_image.txt'.")
输出
Encoded string saved in 'encoded_image.txt'.
将字符串转换回图像
以下代码从“encoded_image.txt”读取编码的字符串,使用 base64.b64decode() 解码它以获得其二进制数据,然后使用 PIL 库的 Image.open() 函数和 BytesIO 提供的文件式访问从这些字节创建图像对象。最后,显示或显示图像对象,以便您可以在屏幕上查看它;有效地解码、重建和可视化编码的图像字符串,然后最终将其显示在屏幕上以进行可视化
示例
import base64 from io import BytesIO from PIL import Image # Read the encoded string from the text file with open('encoded_image.txt', 'r') as file: encoded_string = file.read() # Decode the string decoded_string = base64.b64decode(encoded_string) # Create an image object from the decoded bytes image = Image.open(BytesIO(decoded_string)) # Display or save the image image.show()
输出
方法 2:使用 Zlib 和 Binascii
Zlib 是一个 Python 压缩库,它提供使用 DEFLATE 算法进行数据压缩和解压缩的功能,对于文件或网络传输具有高效的功能。此外,它压缩/解压缩流(字符串/二进制数据)的能力在处理大量信息时非常宝贵。
Python 的 binascii 模块提供将二进制数据转换为文本协议或格式的功能,这些协议或格式使数据易于阅读和传输;使用文本协议或格式(例如十六进制、Base64 或可打印引号表示)使数据易于阅读或传输。在处理需要在传输或存储过程中转换为文本格式的二进制数据时,处理大型数据集时,通常会使用 Binascii,这些数据集需要使用基于文本的协议或格式进行存储或传输。
将图像转换为字符串
在下面的代码中,我们读取上面提到的图像文件(Tutorials point 徽标)并使用 zlib 库压缩其数据。之后,压缩的数据使用 binascii 库转换为十六进制字符串,然后存储在名为“compressed_image.txt”的文本文件中。
示例
import zlib import binascii # Read image file with open('tpt_logo.jpg', 'rb') as image_file: image_data = image_file.read() # Compress the image data using zlib. compressed_data = zlib.compress(image_data) # Convert the compressed data to a hexadecimal string. hex_string = binascii.hexlify(compressed_data).decode('utf-8') # Save the hexadecimal string in a text file. with open('compressed_image.txt', 'w') as file: file.write(hex_string) print("Hexadecimal string saved in 'compressed_image.txt'.")
输出
Hexadecimal string saved in 'compressed_image.txt'.
将字符串转换回图像
以下代码从“compressed_image.txt”文件读取十六进制字符串。该字符串使用 binascii.unhexlify() 转换回压缩数据。然后,zlib.decompress() 用于解压缩数据。解压缩的数据以二进制模式 ('wb') 写入名为“reconstructed_image.jpg”的新文件。输出表明已成功保存重建的图像。
注意 − 在这里,图像重建代码将其结果保存在同一个文件夹中,不会直接显示给用户;而是我们手动打开它并在下面显示为输出。
示例
import zlib import binascii # Read the hexadecimal string from the text file. with open('compressed_image.txt', 'r') as file: hex_string = file.read() # Convert the hexadecimal string to compressed data. compressed_data = binascii.unhexlify(hex_string) # Decompress the data using zlib decompressed_data = zlib.decompress(compressed_data) # Create a new file and write the decompressed data to it. with open('reconstructed_image.jpg', 'wb') as image_file: image_file.write(decompressed_data) print("Reconstructed image saved as 'reconstructed_image.jpg'.")
输出
Reconstructed image saved as 'reconstructed_image.jpg'.
结论
Python 中有不同的方法可以将图像转换为字符串,主要包括 base64 编码/解码以及使用 zlib 和 binascii 进行压缩以进行二进制表示到文本表示的转换。我们在本教程中讨论了这两种方法。无论采用哪种方法,最终它们都为我们提供了更有效地存储、传输和处理图像数据的选择。