Debug|百度OCR识别错误error_code: 216205

1. 什么错误

在使用百度OCR识别时遇到了错误error_code: 216205。
参照文档【百度OCR文字识别 - API文档 - 错误码】中的描述,是我的图片转base64后大于10M

测试两张图片:923k图片的Base64 大于 10M;2M图片的Base64 小于 10M。

# 电脑上看的图片大小为
923 KB

# 代码计算的图片大小如下:
img_pil大小(MB): 26.162841796875
img_base64大小(MB): 11.161312103271484
# 电脑上看的图片大小为
2.35 MB

# 代码计算的图片大小如下:
img_pil大小(MB): 4.660074234008789
img_base64大小(MB): 2.640827178955078

这种差异通常是由于图像在存储和显示时采用的压缩方式不同而导致的。

  • 在计算机上查看图片时,常见的图像格式(如JPEG、PNG等)会对图像进行有损或无损的压缩,以减小文件大小并提高传输和存储效率。
  • 代码中计算的图片大小是根据图像的原始数据(像素数量和颜色通道数)计算的,不考虑压缩。

具体来说,

  • 计算机上查看图片的大小通常是根据图像文件的实际字节数(包括文件头和元数据)以及压缩后的图像数据来计算的。
  • 而代码中计算的图片大小则是根据图像的原始数据(像素数量和颜色通道数)直接计算的,并不考虑压缩。
  • 因此,这两种大小之间可能存在较大的差异。

另外,计算机上查看图片的大小也可能受到操作系统、查看软件以及显示器分辨率等因素的影响。
因此,即使是相同的图像文件,在不同的环境中查看可能会显示不同的大小。

2. 解决方案

源代码

def pillow_to_base64(image):
	"""PIL图像转base64编码"""
    img_buffer = BytesIO()
    image.save(img_buffer, format='PNG')
    byte_data = img_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str
    
# 将上传的图像转换为PIL Image对象
img_pil = Image.fromarray(img)
img_base64 = pillow_to_base64(img_pil)
# 后续代码 #

修改代码

def pillow_to_base64(image):
	"""PIL图像转base64编码"""
    img_buffer = BytesIO()
    image.save(img_buffer, format='PNG')
    byte_data = img_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str
    
def compute_size_MB(img):
    print('===计算图像大小===')
    img_size = img.width * img.height * 3 / (1024 * 1024)  # 假设RGB颜色模式,每个像素3个字节
    return img_size
    
def resize_and_compress_image(img_pil):
    img_pil_compressed = img_pil
    img_pil_size = compute_size_MB(img_pil)  # 计算初始图像大小
    compression_count = 0  # 压缩次数计数器
    while img_pil_size > 20:  # 如果图像大小超过20MB,则进行压缩处理
        img_pil_compressed = img_pil_compressed.resize((img_pil_compressed.width // 2, img_pil_compressed.height // 2))
        img_pil_size = compute_size_MB(img_pil_compressed)  # 重新计算压缩后图像的大小
        compression_count += 1  # 每次压缩增加计数器
        print("第 {} 次压缩后图像大小(MB): {}".format(compression_count, img_pil_size))
    return img_pil_compressed, compression_count

def process_and_convert_to_base64(img_pil):
    img_pil_compressed, compression_count = resize_and_compress_image(img_pil)
    img_base64 = pillow_to_base64(img_pil_compressed)
    img_pil_size = compute_size_MB(img_pil_compressed)
    print("总共压缩了 {} 次".format(compression_count))
    return img_base64, img_pil_compressed,img_pil_size

# 将上传的图像转换为PIL Image对象
img_pil = Image.fromarray(img)
img_pil_compressed = img_pil.copy()
img_base64 = pillow_to_base64(img_pil)

# 计算img_pil的大小,添加压缩处理
img_pil_size = compute_size_MB(img_pil)
if img_pil_size > 20:        
    img_base64,img_pil_compressed,img_pil_size = process_and_convert_to_base64(img_pil)

# 计算img_base64的大小
img_base64_size = len(img_base64) / (1024 * 1024)
print("img_pil大小(MB):", img_pil_size)
print("img_base64大小(MB):", img_base64_size)
# 后续代码 #

输出

===计算图像大小===
===计算图像大小===1 次压缩后图像大小(MB): 6.54071044921875
===计算图像大小===
总共压缩了 1 次
img_pil大小(MB): 6.54071044921875
img_base64大小(MB): 3.7413558959960938

3. 有什么疑问

  1. 图片转Base64编码后为什么会变大?图片不到1M,转base64后会超过10M吗?

ChatGPT:在绝大多数情况下,转换成Base64编码后的图片大小会比原始图片的大小增加约1/3左右。这是因为Base64编码是一种将二进制数据转换为文本数据的方式,而文本数据通常会比二进制数据占用更多的空间。因此,如果原始图片的大小已经接近1MB,那么转换成Base64编码后,其大小可能会超过1MB。

具体来说,如果原始图片大小接近1MB,那么转换成Base64编码后的大小可能会接近1.3MB左右。因此,如果您担心图片大小超过10MB的限制,建议先检查原始图片的大小,以便估算转换后的Base64编码大小。

  1. 为什么这个大小和电脑上看到的大小不一样?

ChatGPT:计算出来的图像大小是基于图像数据本身的像素数量和颜色通道数的简单估算,并不考虑图像压缩等因素。而在电脑上查看图像时,通常会考虑到图像的压缩方式以及显示器的分辨率等因素,因此会和计算出来的大小有所不同。

电脑上查看图像的大小通常是按照图像的实际分辨率和压缩方式来显示的,而不是以图像文件的字节大小为准。例如,在电脑上查看JPEG格式的图像时,会根据JPEG压缩的质量参数以及显示器的分辨率等因素来调整图像的显示大小,这可能和图像文件的字节大小并不完全一致。

因此,图像在计算机上显示的大小和图像文件的字节大小可能会有所差异,这取决于多种因素,包括图像文件的压缩方式、显示器的分辨率、查看图像的软件等。

  1. 为什么代码中img_pil大于20M再压缩?
    因为观察到img_pil大小 是Base64编码大小 的2倍,Base64编码大小限制为10M,所以在img_pil是20M左右时进行压缩处理。一次压缩把尺寸缩小一半,循环处理,还是大于20M,再缩一次,直到小于20M,才能符合百度OCR的识别条件。

4. 参考文档

【文档参照】百度OCR文字识别 - API文档 - 错误码
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/401668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Maven的下载安装配置教程

一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下…

Day16_集合与泛型(泛型类与泛型接口,泛型方法,类型变量的上限与泛型的擦除,类型通配符)

文章目录 Day16 泛型学习目标1 泛型的概念1.1 没有泛型的问题1.2 泛型的引入1.2 泛型的好处1.3 泛型的定义 2 泛型类与泛型接口2.1 使用核心类库中的泛型类/接口案例一:Collection集合相关类型案例二:Comparable接口 2.2 自定义泛型类与泛型接口语法格式…

【成都游戏业:千游研发之都的发展与机遇】

成都游戏业: 千游研发之都的发展与机遇 作为我国西部游戏产业的龙头,成都这座城市正在高速发展,目标是崛起成为千亿级游戏研发之都。多年来,在政策扶持、人才汇聚以及文化底蕴等助力下,成都游戏业已经形成完整的产业链…

matlab代码--基于stbc编码的MIMO-OFDM系统的误码率分析

1 前言 空时分组编码STBC(Space Time Block Coding)用在无线通信中传输一个数据流的多个拷贝。通过许多天线来产生数据的多种接收版本,提高数据传输的可靠性。接收机接收到的数据拷贝中,存在一些比其它拷贝“更好”的拷贝。而这种…

git中将所有修改的文件上传到暂存区

案例: 我将本地的多个文件进行了修改,导致文件发生了变化。使用git status命令,查看文件的状态,发现有多个文件是modified,即被修改了。 本地文件发生了变化,需要将modified的文件添加到暂存区&#xff0c…

C语言第二十八弹---整数在内存中的存储

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、整数在内存中的存储 2、大小端字节序和字节序 2.1、什么是大小端? 2.2、为什么有大小端? 2.3、练习 2.3.1、练习1 2.3.2、练习2 2.…

尾矿库安全监测系统的主要内容和平台

一、背景 尾矿库安全监测系统是保障尾矿库安全运行的重要手段,通过对尾矿库进行实时监测,可以及时发现潜在的安全隐患,为采取相应的措施提供科学依据。通过对变形因素、相关因素及诱因因素信息的相关分析处理,对灾变体的稳定状态…

南卡、韶音、Cleer开放式耳机好用吗?最强开放式耳机大揭秘!

​作为一位经验丰富的开放式耳机用户,我想向大家提个醒:在选择耳机时,千万不要盲目跟风或过于依赖所谓的“网红”或“大牌产品”。毕竟,每个人的需求和使用环境都是独一无二的。选择适合自己的耳机才是最重要的! 为了…

Python:Keyboard Interrupt - 当代码遇到“Ctrl+C“时发生了什么?

Python:Keyboard Interrupt - 当代码遇到"CtrlC"时发生了什么? 🌈 个人主页:高斯小哥 🔥 高质量专栏:【Matplotlib之旅:零基础精通数据可视化】 💡 创作高质量博文&#x…

Linux之用户和用户组的深入了解

目录 一、简介 1.1、用户: 1.2、用户组 1.3、UID和GID 1.3、用户账户分类 查看用户类别 超级用户root(0) 程序用户(1~499) 普通用户(500~65535) 二、用户 2.1、添加新的用户账号:useradd 2.2、删除账号:userdel 有-r与没有-r区别…

从源代码安装 rocSOLVER 并 调试 rocSOLVER 在 Ubuntu 22.04 平台

0, 下载并编译 rocBLAS 的调试版本 sudo apt install python3.10-venv sudo apt install libmsgpack-dev sudo pip install joblibgit clone --recursive https://github.com/ROCm/rocBLAS.git $ cd rocBLAS/ $ ./install.sh -i -g构建时间也不短 1,下载并编译 roc…

跨界计算与控制,强化显控和UI, 君正MPU再添新旗舰--Ingenic MPU X2600隆重发布

近日,北京君正隆重发布MPU芯片新产品X2600。该产品以商业和工业应用的数个细分领域为重点目标市场,兼顾通用处理器应用需求。无论从CPU结构的设计,还是专门控制器和接口的配备,都体现了北京君正MPU团队“技术路线上追求自主跨界&a…

Linux搭建FISCO BCOS的第一个区块链网络

一、前言 FISCO BCOS是由金融区块链合作联盟(深圳)与微众银行共同发起的开源区块链项目,支持多链多账本,满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令搭建FISCO BCOS的第一个区块链网络。 目录 一…

AJAX——HTTP协议

1 HTTP协议-请求报文 HTTP协议:规定了浏览器发送及服务器返回内容的格式 请求报文:浏览器按照HTTP协议要求的格式,发送给服务器的内容 1.1 请求报文的格式 请求报文的组成部分有: 请求行:请求方法,URL…

IDM下载器2024中文版主要功能、使用场景、优点、缺点介绍

软件分析师眼中的IDM(Internet Download Manager) IDM绿色下载如下: https://wm.makeding.com/iclk/?zoneid34275 一、主要功能 高速下载:利用多线程技术和文件分块下载策略,显著提高下载速度。断点续传:即使在下载…

说一说Eclipse的项目类型和常用项目的区别

Eclipse在新建项目的时候有很多类型,包括Java project、Web project等等,如下: 那么这些项目类型有什么区别呢?我们在创建项目的时候应该如何选择,了解清楚这一点还是非常重要的,但记住一个出发点&#xff…

B端管理系统界面优化的最佳实践:用户至上

Hi,大家好,我是大美B端工场,从事8年前端开发的老司机。本篇分享B端管理系统升级的终极法则,欢迎加关注、评论,如有定制需求可以私信。 一、什么是用户至上 "用户至上"的理念是指在设计和优化B端管理系统界面…

lvs DR模式+基于五台服务器部署keepalived + lvs DR模式架构(前端带路由)负载均衡的高可用集群

lvs DR模式基于五台服务器部署keepalived lvs DR模式架构(前端带路由)负载均衡的高可用集群 DR模式一: 客户端:172.20.26.167 LVS服务器:172.20.26.198 后端服务器:172.20.26.218 后端服务器:172.20.26.210 两台…

【AI应用】SoraWebui——在线文生视频工具

SoraWebui 是一个开源项目,允许用户使用 OpenAI 的 Sora 模型使用文本在线生成视频,从而简化视频创建,并具有轻松的一键网站部署功能 在 Vercel 上部署 1. 克隆项目 git clone gitgithub.com:SoraWebui/SoraWebui.git 2. 安装依赖 cd Sor…

AIoT网关 人工智能物联网网关

AIoT(人工智能物联网)作为新一代技术的代表,正以前所未有的速度改变着我们的生活方式。在这个智能时代,AIoT网关的重要性日益凸显。它不仅是连接智能设备和应用的关键,同时也是实现智能化家居、智慧城市和工业自动化的必备技术。      一…