У меня есть строковое изображение base64, которое нужно преобразовать, поэтому я могу прочитать его как изображение для анализа с помощью pytesseract:
import base64
import io
from PIL import Image
import pytesseract
import sys
base64_string = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFh....."
img_data = base64.b64decode(base64_string)
img = Image.open(io.BytesIO(img_data)) # <== ERROR LINE
text = pytesseract.image_to_string(img, config='--psm 6')
print(text)
дает ошибку:
Traceback (most recent call last):
File "D:\aa\xampp\htdocs\xbanca\aa.py", line 14, in <module>
img = Image.open(io.BytesIO(img_data))
File "D:\python3.10.10\lib\site-packages\PIL\Image.py", line 3283, in open
raise UnidentifiedImageError(msg)
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000001A076F673D0>
Я пытался использовать библиотеки numpy и request, но все они имеют одинаковый результат ... и пример изображения base64 работает нормально в любом другом конвертере.
Вы пробовали использовать другую base64_string? Это работало нормально для меня
Вы не щелкнули опцию, чтобы разделить его на 76 строк символов, не так ли?
Это очень распространенное заблуждение. Строка
base64_string = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFh....."
это не строка Base64, а DataURL
URL-адреса с префиксом данных: схема, позволяющая создателям контента встраивать небольшие файлы в документы.
который содержит строку Base64. Строка Base64 начинается сразу после base64. Поэтому вам нужно отрезать часть «data:image/jpeg;base64».
например.:
b64 = base64_string.split(",")[1]
после этого вы можете декодировать данные:
img_data = base64.b64decode(b64)
Я изменил код из вопроса и использовал base64 следующего небольшого изображения JPEG, которое я закодировал в base64 на https://www.base64encode.org/:
и получил ожидаемый текстовый вывод:
1 ответ
я пытаюсь это сделать, но получаю сообщение «при нагрузке поднять OSError (msg) OSError: файл изображения усечен (6 байт не обработаны)», а также пытаюсь добавить «Image.LOAD_TRUNCATED_IMAGES = True», но получаю ту же ошибку
Вы пробовали с полной строкой? Строка dataURL, которую вы показываете в своем вопросе (которую я скопировал в свой ответ), усечена (.... в конце).
да, конечно, я пытаюсь с реальными и полными изображениями, преобразованными в base64
а в какой строке ошибка?
Поделитесь своим файлом JPEG и строкой base64 через Google Диск или Dropbox, и вы очень быстро получите ответ...
Я установил все необходимое, создал небольшой образ, преобразовал его в base64 и использовал с вашим кодом и модификацией согласно моему ответу и получил ожидаемый результат. Так что может быть что-то не так с вашим изображением. Но главной проблемой была неправильная обработка DataURL, которую нужно решить сейчас.
@MarkSetchell вот несколько изображений для тестирования ссылка все они снимки экрана мобильных устройств, странно то, что с некоторыми img работает, а с другими нет, проверьте сами ..
Я загрузил картинки, преобразовал их все в base64 с помощью кодировщика, упомянутого в ответе, вставил строки base64 одну за другой в dataURL в коде и запустил его. Он работал совершенно нормально для всех 5 картинок.
@jps Так же! Было бы полезнее, если бы OP указал, какое изображение не удалось, и поделился соответствующей строкой base64 по моему запросу.
Где вы взяли строку base64? Покажите нам первые несколько сотен байтов, чтобы мы могли понять, что это такое.