using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text; namespace Common.Utils
{
public static class OCRUtil
{
private const String Host = "https://ocrapi-document.taobao.com";
private const String Path = "/ocrservice/document";
private const String Method = "POST";
private const String Appcode = "************";
private static readonly IList<string> ImageExList = new List<string>()
{
".jpg",
".png",
".bmp"
}; /// <summary>
/// 确保图片可用
/// </summary>
/// <param name="fileName"></param>
private static void EnsureImageCanUse(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
throw new ArgumentNullException(nameof(fileName), "文件名为空");
}
if (!File.Exists(fileName))
{
throw new FileNotFoundException("文件不存在", fileName);
}
string ex = System.IO.Path.GetExtension(fileName);
if (ImageExList.IndexOf(ex.ToLower()) == -)
{
throw new FileFormatException("图片格式需为jpg,png,bmp");
}
FileInfo fileInfo = new FileInfo(fileName);
if (fileInfo.Length > * * )
{
throw new Exception("文件不能大于4M");
}
} /// <summary>
/// 将图片转换为Base64字符串
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private static string ImageToBase64String(string fileName)
{
Bitmap bitmap = new Bitmap(fileName);
string ex = System.IO.Path.GetExtension(fileName).ToLower();
using (MemoryStream ms = new MemoryStream())
{
ImageFormat format;
switch (ex)
{
case ".png":
format = ImageFormat.Png;
break;
case ".jpg":
format = ImageFormat.Jpeg;
break;
default:
format = ImageFormat.Bmp;
break;
}
bitmap.Save(ms, format);
byte[] arr = new byte[ms.Length];
ms.Position = ;
ms.Read(arr, , (int)ms.Length);
ms.Close();
return Convert.ToBase64String(arr);
}
} /// <summary>
/// 阿里云OCR图片转文字
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string ImageToText(string fileName)
{
EnsureImageCanUse(fileName); String querys = "";
String bodys = "{\"img\":\"" + ImageToBase64String(fileName) + "\",\"url\":\"\",\"prob\":false}";
String url = Host + Path;
HttpWebRequest httpRequest = null;
HttpWebResponse httpResponse = null; if ( < querys.Length)
{
url = url + "?" + querys;
} if (Host.Contains("https://"))
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
httpRequest = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
}
else
{
httpRequest = (HttpWebRequest)WebRequest.Create(url);
}
httpRequest.Method = Method;
httpRequest.Headers.Add("Authorization", "APPCODE " + Appcode);
//根据API的要求,定义相对应的Content-Type
httpRequest.ContentType = "application/json; charset=UTF-8";
if ( < bodys.Length)
{
byte[] data = Encoding.UTF8.GetBytes(bodys);
using (Stream stream = httpRequest.GetRequestStream())
{
stream.Write(data, , data.Length);
}
} httpResponse = (HttpWebResponse)httpRequest.GetResponse();
if (httpResponse.StatusCode != HttpStatusCode.OK)
{
throw new WebException("阿里云OCR接口调用识别失败");
} Stream st = httpResponse.GetResponseStream();
StreamReader reader = new StreamReader(st, Encoding.GetEncoding("utf-8"));
string responseStr = reader.ReadToEnd(); OcrResult ocrResult = JsonConvert.DeserializeObject<OcrResult>(responseStr);
return OcrResultToString(ocrResult);
} private static string OcrResultToString(OcrResult ocrResult)
{
StringBuilder sb = new StringBuilder();
var wordList = ocrResult.prism_wordsInfo;
foreach (var item in wordList)
{
int leftX = item.pos[].x;
int blankSpaceCount = (int)Math.Floor((double)leftX / );
if (blankSpaceCount > )
{
sb.Append(' ', blankSpaceCount*);
}
sb.AppendLine(item.word);
}
return sb.ToString();
} public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
}
} /// <summary>
/// OCR识别结果
/// </summary>
public class OcrResult
{
public string sid { get; set; }
public string prism_version { get; set; }
public int prism_wnum { get; set; }
public List<Prism_Wordsinfo> prism_wordsInfo { get; set; }
public int height { get; set; }
public int width { get; set; }
public int orgHeight { get; set; }
public int orgWidth { get; set; }
} public class Prism_Wordsinfo
{
public string word { get; set; }
public IList<Pos> pos { get; set; }
} public class Pos
{
public int x { get; set; }
public int y { get; set; }
} }

阿里云OCR图片转换成文字识别调用的更多相关文章

  1. 利用百度AI OCR图片识别,Java实现PDF中的图片转换成文字

    序言:我们在读一些PDF版书籍的时候,如果PDF中不是图片,做起读书笔记的还好:如果PDF中的是图片的话,根本无法编辑,做起笔记来,还是很痛苦的.我是遇到过了.我们搞技术的,当然得自己学着解决现在的痛 ...

  2. 使用阿里云的图片识别成表格ocr(将图片表格转换成excel)

    为了简便财务总是要对照着别人发来的表格图片制作成自己的表格 图片识别 识别成表格 表格识别 ocr 使用阿里云api 购买(印刷文字识别-表格识别) https://market.aliyun.com ...

  3. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  4. 教你一招:Word中的文字转换成表格,把表格转换成文字

    在使用office软件时,常常会在Word中加入表格,这时候我们一般想到的是,建立表格,然后一格一格的填写;或者用Excel表格制作在复制到Word文档中.其实在Word中就可以将文本文档转换成电子表 ...

  5. UI进阶 科大讯飞(1) 语音听写(语音转换成文字)

    一.科大讯飞开放平台: http://www.xfyun.cn/ 注册.登录之后创建新应用. 因为本项目只实现了语音听写,所以在SDK下载中心勾选语音听写单项SDK就可以了 开发平台选择iOS,应用选 ...

  6. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

  7. 使用CSS将图片转换成黑白(灰色、置灰)z转

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  8. [转]C#将image中的显示的图片转换成二进制

    本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...

  9. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...

随机推荐

  1. Django学习之十二:Cache 缓存组件

    目录 Django Cache 缓存组件 缓存逻辑伪代码 配置缓存源 可配置参数说明 01. Django的默认缓存 02. 基于Redis的django-redis 03. 自定义cache 04. ...

  2. 微信小程序计算器Bug版=-=(笔记)

    微信小程序计算器BUG版本 无APPID的测试号登录,先在app.json中更改路径,以及修改头部信息. 首先一个输入框字段用{{screenData}} 功能可以退格,清屏,正负号,正常操作加减乘除 ...

  3. 写个重新加载 ocelot 配置的接口

    写个重新加载 ocelot 配置的接口 Intro 我们想把 ocelot 的配置放在自己的存储中,放在 Redis 或者数据库中,当修改了 Ocelot 的配置之后希望即时生效,又不想在网关这边定时 ...

  4. 通过href链接实现从当前页面跳转到动态页的指定页面的实现方式

    指定页的jsp的href设置 <a href="/lekg/check/shangchuan2.jsp?tabtype=2"><li><img src ...

  5. SQL Server获取连续区间的日期

    个人理解的方法有三种 通过系统表master..spt_values获取 用WHILE循环获取 游标获取 CET递归(感谢评论区博友) 方法一:通过系统表master..spt_values获取 1. ...

  6. 【原】无脑操作:Centos 7后台运行及终止jar包程序

    1.后台运行jar包程序,输入:nohup java -jar /路径/程序.jar & 2.后台终止jar包程序,输入:ps -ef | grep java,查看使用java命令的进程,再输 ...

  7. 周一01.2 计算机硬件&操作系统

    一.计算机硬件组成 1)控制器:是计算机的指挥系统 2)运算器:数学运算&逻辑运算 3)存储器:存取数据 内存:相当于人的短期记忆(缺点:断电数据会丢失:优点:存取速度快) 外存:相当于一个本 ...

  8. spring mvc多个请求的影响 和使用全局变量

    对于那些会以多线程运行的单例类(比如spring mvc中的controller,dao,service): 局部变量不会受多线程影响 成员变量会受到多线程影响 如果方法里有成员变量,只有读操作,不受 ...

  9. Python 进度条显示

    运行工具:Pycharm, import timescale = 50print("开始执行".center(scale//2,"-")) start = ti ...

  10. java集合常见面试题

    1. Array和ArrayList的区别,什么时候更合适用Array a)      Array是数组,可以容纳基本类型和对象,而ArrayList是集合,只能容纳对象 b)      Array是 ...