我正在使用 Pillow 处理图像。我试图直接在字节字符串中捕获结果,以便我可以保存到数据库而无需先保存到本地文件系统。该代码适用于许多图像,但在其中一个上失败。
我已经尝试尽可能多地记录有关字节字符串的信息,但我看不到任何明显错误的字节。一个区别是它失败的图像只是白色像素。我不确定为什么这会使它无法编码。
我看过:Python / Django 在解码由 javascript 编码为 base64 的文件时失败 但是那里的答案没有帮助。
我应该寻找什么作为问题的原因?我应该记录什么信息?知道什么可能导致问题吗?
下面的代码:
from PIL import Image
import numpy as np
import io
import base64
def remove_lines(data):
im = Image.open(io.BytesIO(data)).convert("L")
array = np.asarray(im)
<do stuff to array>
im = Image.fromarray(array, 'L')
print(f"\narray shape: {array.shape}\n")
print(f"type of array: {type(array)}\n")
image_bytes = io.BytesIO()
im.save(image_bytes, format='PNG')
image_bytes = image_bytes.getvalue()
print(f"start of image_bytes:\n{image_bytes[:30]}\n")
print(f"end of image_bytes:\n{image_bytes[-30:]}\n")
# test the encoding by trying to decode
string = base64.b64decode(image_bytes)
print("success\n")
输出:
page number: 0
2019-01-15 21:51:50,930 STREAM b'IHDR' 16 13
2019-01-15 21:51:50,930 STREAM b'pHYs' 41 9
2019-01-15 21:51:50,930 STREAM b'IDAT' 62 8192
array shape: (1651, 1275)
type of array: <class 'numpy.ndarray'>
start of image_bytes:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xfb\x00\x00\x06s\x08\x00\x00\x00\x00\xa8'
end of image_bytes:
b'OD,R\xfbD\xc4\xa2\xff\x01\xf6)\xc6\x7fj\xbfU\xe8\x00\x00\x00\x00IEND\xaeB`\x82'
success
page number: 1
2019-01-15 21:52:09,142 STREAM b'IHDR' 16 13
2019-01-15 21:52:09,143 STREAM b'pHYs' 41 9
2019-01-15 21:52:09,143 STREAM b'IDAT' 62 8192
array shape: (1754, 1241)
type of array: <class 'numpy.ndarray'>
start of image_bytes:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xd9\x00\x00\x06\xda\x08\x00\x00\x00\x00\xdd'
end of image_bytes:
b'!d>\xa8l\x84\x90\xf9\xf8?\xf1\xab\x9a-\xf3\xf7\x94\xbd\x00\x00\x00\x00IEND\xaeB`\x82'
success
page number: 2
2019-01-15 21:52:20,700 STREAM b'IHDR' 16 13
2019-01-15 21:52:20,700 STREAM b'pHYs' 41 9
2019-01-15 21:52:20,701 STREAM b'IDAT' 62 8192
array shape: (1754, 1241)
type of array: <class 'numpy.ndarray'>
start of image_bytes:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x04\xd9\x00\x00\x06\xda\x08\x00\x00\x00\x00\xdd'
end of image_bytes:
b'\x03z\x9c\r\xe8q6\xa0\xe7\x02Dl\x0e\xb3\x8f\xebQ,\x00\x00\x00\x00IEND\xaeB`\x82'
Traceback (most recent call last):
File "aex_image_cleaner.py", line 54, in <module>
main()
File "aex_image_cleaner.py", line 34, in main
data = cleaner.remove_lines(base64.b64decode(image_data))
File "cleaner.pyx", line 39, in cleaner.remove_lines
string = base64.b64decode(image_bytes)
File "/home/neil/anaconda3/lib/python3.7/base64.py", line 87, in b64decode
return binascii.a2b_base64(s)
binascii.Error: Invalid base64-encoded string: length cannot be 1 more than a multiple of 4