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

news2024/12/26 23:41:17

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文档 - 错误码
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音视频下载工具|视频内容提取软件

引言部分: 针对抖音视频下载需求,我们团队自豪推出一款功能强大的工具,旨在解决用户获取抖音视频繁琐问题的困扰。我们通过基于C#开发的工具,让用户能够轻松通过关键词搜索实现自动批量抓取视频,并根据需求进行选择性批…

yolov8-seg dnn调用

接上篇一直更换torch、opencv版本都无法解决这个问题(seg调用dnn报错)。那问题会不会出在yolov8源码本身呢。yolov8的讨论区基本都看过了,我决定尝试在其前身yolov5的讨论区上找找我不信没人遇到这个问题。很快找到下面的讨论第一个帖子&…

Node.JS入门(day01)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈 一、为什么要学习Node.JS ①可以让其他人访问我们编写的网页 ②为后续的框架学习打基础 二、Node.JS是什么 官方:Node.js是一个…

8.qt5使用opencv的库函数打开图片

1.配置opencv动态库的环境变量 2.在创建的qt工程中加入如下opencv代码,具体代码如下: 使用opencv库函数显示图片

编写LLVM Pass的一个小问题

在阅读官方文档时发现一个很有趣的细节,官方给出了一个测试用例,此处有一个小问题(%无法复制)。但是我在使用自己编译的ll文件时,我发现该pass无法正常使用。最后经过测试发现是利用-O0编译产生的ll文件有optnone的fla…

数据库管理-第154期 Oracle Vector DB AI-06(20240223)

数据库管理154期 2024-02-23 数据库管理-第154期 Oracle Vector DB & AI-06(20240223)1 环境准备创建表空间及用户TNSNAME配置 2 Oracle Vector的DML操作创建示例表插入基础数据DML操作UPDATE操作DELETE操作 3 多Vector列表4 固定维度的向量操作5 不…

【达梦数据库】数据库的方言问题导致的启动失败

问题场景 在项目中采用了hibernate ,连接数据库原本为ORACLE,后续打算改造为国产数据库 达梦 链接配置: # 达梦写法, index:driver-class-name: dm.jdbc.driver.DmDriverjdbc-url: jdbc:dm://192.168.220.225:5236/IDX4username:…

深入探索pdfplumber:从PDF中提取信息到实际项目应用【第94篇—pdfplumbe】

深入探索pdfplumber:从PDF中提取信息到实际项目应用 在数据处理和信息提取的过程中,PDF文档是一种常见的格式。然而,要从PDF中提取信息并进行进一步的分析,我们需要使用适当的工具。本文将介绍如何使用Python库中的pdfplumber库来…

危险!Wyze 摄像头安全漏洞致1.3万用户隐私遭窥探

最近,一则关于 Wyze 摄像头再次出现安全漏洞的新闻引起了人们的广泛关注。据报道,该安全漏洞导致约1.3万用户的摄像头受到了未经授权的访问,使得这些用户的隐私信息遭到了窥视。这一事件再次引发了人们对网络安全的关注和讨论。 网络安全不仅…

老杨说运维 | 运维大数据价值探索

文末附有视频 伴随第六届双态IT乌镇用户大会的圆满完成,擎创科技“一体化数智管理和大模型应用”主题研讨会也正式落下了帷幕。 云原生转型正成为很多行业未来发展战略,伴随国家对信创数字化要求的深入推进,面对敏稳共存这一近年出现的新难…

svn客户端下载、安装、使用

下载、使用 打开360软件管家,选怎宝库,搜索svn,点击安装 可以修改安装路径 使用 在桌面右键弹出菜单,点击 输入地址,点击ok 输入用户名、密码 ,等待检出完成

Linux 可视化管理-webmin 和 bt 运维工具安装教程

Linux 可视化管理-webmin 和 bt 运维工具安装教程 webmin webmin 是功能强大的基于 Web 的 Unix/linux 系统管理工具。管理员通过浏览器访问 Webmin 的各种管理功能并完成相应的管理操作。除了各版本的 linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和…

Linux学习方法-框架学习法——Linux应用程序编程框架

配套视频学习链接:https://www.bilibili.com/video/BV1HE411w7by?p4&vd_sourced488bc722b90657aaa06a1e8647eddfc 目录 Linux应用程序编程 Linux应用程序编程 Linux文件I/O(input/output) Linux文件I/O(五种I/O模型) Linux多进程 Linux多线程 网络通信(s…

游戏空间划分技术

一、 前言 空间划分算法有很多,比如均匀网格,四/八叉树,k-d树,Bsp树,每一种算法都有自己的优缺点,我们需要从理论上理解这些算法,然后在实际项目中进行灵活的运用。 游戏中经常使用空间划分算…

【深度学习】Pytorch 系列教程(七):PyTorch数据结构:2、张量的数学运算(5):二维卷积及其数学原理

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor(张量)1. 维度(Dimensions)2. 数据类型(Data Types)3. GPU加速(GPU Acceleration) 2、张量的数学运算1. 向量运算2. 矩阵…

TESTLINK 测试用例数据结构解析

一、node_types 测试组件信息表 我们查询表 select * from testlink.node_types; 得到如下结果 二、nodes_hierarchy 测试用例目录层次表 我们以下图的项目为例,来讲解 1、测试项目 首先,我们有个Train的项目,存在表testprojects中&#…

动态获取 微信小程序appid / 自定义启动命令

官网:https://uniapp.dcloud.net.cn/collocation/package.html#%E7%94%A8%E6%B3%95 小程序开发完成之后需要一套代码多个小程序使用,每次都需要在manifest.json文件中手动修改,大大增加了开发的复杂度。 官网:https://uniapp.dcl…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

Flink 内存管理(一):设置 Flink 进程内存 1.配置 Total Memory2.JVM 参数3.根据比例限制的组件(Capped Fractionated Components) Apache Flink 通过严格控制各种组件的内存使用,在 JVM 上提供高效的工作负…

测试计划、测试方案、测试策略、测试用例的区别

一 测试计划 测试计划是指描述了要进行的测试活动的范围、方法、资源和进度的文档。它主要包括测试项、被测特性、各阶段的测试任务、时间进度安排,谁执行任务和风险控制等,可以包括测试策略。 二 测试方案 测试方案是指描述需要测试的特性、测试的方…

Android 输入法框架简介

每种平台都有自己的输入法框架. GNU/Linux 桌面环境有多种输入法框架, 比如 ibus, fcitx 等. 但是 Android 操作系统只有一种, 是统一提供的输入法框架. 相关链接: 《ibus 源代码阅读 (1)》 https://blog.csdn.net/secext2022/article/details/136099328https://developer.and…