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. 第一章 渲染调度来龙去脉——插入自己的shader

    总有人会问,这个或者那个功能怎么弄,或者看到别人做了什么酷炫的效果也想仿造.其实,功能的实现无非两种: 1.调用Cesium现有的API组合实现:往往照猫画虎,还存在性能不过关的问题,绕了半天其实终究 ...

  2. .Net Core 爬坑日记

    安装[DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe]失败 查看log发现,发现猫腻,然后copy下链接,用迅雷手动下载[AspNetCoreLocalFe ...

  3. Amqp整合com.rabbitmq.client.ShutdownSignalException: channel error; protocol method异常处理

    java.io.IOException at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:126) at com.rabbitmq ...

  4. shell编写小技巧整理

    1. if和else语句可以进行嵌套.if的条件判断部分可能会变得很长,可以使用逻辑运算符将它变得简洁一些. [ condition ] && action :如果condition为 ...

  5. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  6. MappedByteBuffer

    计算机内存管理 原文链接 https://www.cnblogs.com/guozp/p/10470431.html MMC:CPU的内存管理单元. 物理内存:即内存条的内存空间. 虚拟内存:计算机系 ...

  7. 尴尬的事情又发生Newtonsoft.Json vs Protobuf.net

    写程序做下性能测试都是例行的事情了,一般在普通电脑上测试一下如果比较理想那基本不出什么意外!但世事难料,代码写得不好经常担心CPU不够用,其实写得好但不能完全发挥出CPU资源的优势更是一件悲剧的事情! ...

  8. java~接口的共享实体使用Map后更灵活

    微服务时代的实体设计 在一个微服务时代,一个实体参数或者返回值,它可能是多服务之前共享的,而这个重复的实体你需要拷贝多份,这是违背DRP原则的,所以我们需要找一种更友好的方式来代替它,它就是Map,我 ...

  9. Python自省

    自省就是通过一定机制查询到对象的内部结构,也就是运行时获取对象内部的属性以及类型,在Python中dir(),type(), hasattr(), isinstance()都是很好的自省例子 #!/u ...

  10. 并发系列(4)之 AbstractQueuedSynchronizer 源码分析

    本文将主要讲述 AbstractQueuedSynchronizer 的内部结构和实现逻辑,在看本文之前最好先了解一下 CLH 队列锁,AbstractQueuedSynchronizer 就是根据 ...