【图片区域识别导出表格】图片文档指定区域文字识别:多位置信息的保存到 Excel 导出工具开发
·
在市场调研方面,企业可能收集了数以万计来自不同渠道(如社交媒体、竞争对手网站等)的关于市场趋势、竞争对手产品等的图片。识别图片中的关键信息(如广告文案、产品新特性等)后改名,并将数据导出到表格,可以帮助企业深入分析市场动态,制定更有效的竞争策略。
以下是使用 WPF 和腾讯 API 开发图片文档指定区域文字识别工具,并将多位置信息保存到 Excel 的详细步骤和代码示例:
1. 环境准备
- 安装所需库:
- 确保你已经安装了.NET 开发环境,包含 WPF 支持。
- 使用 NuGet 包管理器安装以下库:
Newtonsoft.Json:用于解析腾讯 API 的 JSON 响应。ClosedXML:用于操作 Excel 文件。
2. 注册腾讯 OCR 服务并获取 API Key 和 Secret Key
- 访问腾讯云官网,注册并登录。
- 进入腾讯 OCR 服务页面,创建一个应用,获取
API Key和Secret Key。
3. 项目结构
在你的 WPF 项目中,创建以下文件和文件夹:
plaintext
ImageOCR_Project/
├── MainWindow.xaml
├── MainWindow.xaml.cs
└── TencentOCRHelper.cs
MainWindow.xaml:包含 WPF 界面的 XAML 文件。MainWindow.xaml.cs:包含界面的逻辑代码。TencentOCRHelper.cs:包含使用腾讯 OCR API 进行 OCR 识别的辅助类。
4. 编写 MainWindow.xaml 文件
以下是一个简单的 MainWindow.xaml 示例,包含一个按钮用于触发操作,几个文本框用于输入图片路径和区域信息,以及一个显示结果的文本块:
xml
<Window x:Class="ImageOCR_Project.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Image OCR Tool" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Image Path:" Margin="5"/>
<TextBox Grid.Row="0" Grid.Column="1" x:Name="ImagePathTextBox" Margin="5"/>
<TextBlock Grid.Row="1" Grid.Column="0" Text="Region 1 (x,y,width,height):" Margin="5"/>
<TextBox Grid.Row="1" Grid.Column="1" x:Name="Region1TextBox" Margin="5"/>
<TextBlock Grid.Row="2" Grid.Column="0" Text="Region 2 (x,y,width,height):" Margin="5"/>
<TextBox Grid.Row="2" Grid.Column="1" x:Name="Region2TextBox" Margin="5"/>
<Button Grid.Row="3" Grid.ColumnSpan="2" Content="Start OCR" Click="Button_Click" Width="100" Height="30" HorizontalAlignment="Center" Margin="5"/>
<TextBlock Grid.Row="4" Grid.ColumnSpan="2" x:Name="ResultTextBlock" Margin="5" FontSize="14"/>
</Grid>
</Window>
5. 编写 TencentOCRHelper.cs 文件
以下是 TencentOCRHelper.cs 的示例代码,用于使用腾讯 OCR API 进行 OCR 识别:
csharp
using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace ImageOCR_Project
{
public static class TencentOCRHelper
{
private const string API_Key = "your_api_key";
private const string Secret_Key = "your_secret_key";
private const string OCR_URL = "https://tencent-ocr-api-url"; // 替换为腾讯 OCR 的 API 地址
public static async Task<string[]> OCRImage(string imageFilePath, int[] region)
{
var client = new HttpClient();
var sign = GenerateSignature();
client.DefaultRequestHeaders.Add("Authorization", sign);
var imageData = CropImage(imageFilePath, region);
var base64Image = Convert.ToBase64String(imageData);
var content = new StringContent($"image={base64Image}", Encoding.UTF8, "application/x-www-form-urlencoded");
var response = await client.PostAsync(OCR_URL, content);
var responseString = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<TencentOCRResponse>(responseString);
var ocrText = result.TextDetections.Select(item => item.DetectedText).ToArray();
return ocrText;
}
private static string GenerateSignature()
{
// 这里需要根据腾讯的签名算法生成签名,以下是一个简单示例,你需要根据腾讯的文档实现具体逻辑
var timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var signStr = $"app_key={API_Key}×tamp={timestamp}&secret_key={Secret_Key}";
var sign = ComputeHash(signStr); // 计算签名,例如使用 SHA256 等哈希算法
return $"Signature {sign}";
}
private static byte[] CropImage(string imageFilePath, int[] region)
{
using (var image = System.Drawing.Image.FromFile(imageFilePath))
{
var bitmap = new System.Drawing.Bitmap(image);
var rect = new System.Drawing.Rectangle(region[0], region[1], region[2], region[3]);
var croppedBitmap = bitmap.Clone(rect, bitmap.PixelFormat);
var stream = new MemoryStream();
croppedBitmap.Save(stream, image.RawFormat);
return stream.ToArray();
}
}
private static string ComputeHash(string input)
{
// 这里使用 SHA256 作为示例,你可以根据腾讯的要求选择不同的哈希算法
using (var sha256 = System.Security.Cryptography.SHA256.Create())
{
var bytes = Encoding.UTF8.GetBytes(input);
var hashBytes = sha256.ComputeHash(bytes);
var builder = new StringBuilder();
foreach (var b in hashBytes)
{
builder.Append(b.ToString("x2"));
}
return builder.ToString();
}
}
}
public class TencentOCRResponse
{
public List<TencentOCRItem> TextDetections { get; set; }
}
public class TencentOCRItem
{
public string DetectedText { get; set; }
}
}
6. 编写 MainWindow.xaml.cs 文件
以下是 MainWindow.xaml.cs 的示例代码,用于处理整个流程:
csharp
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Threading.Tasks;
using ClosedXML.Excel;
namespace ImageOCR_Project
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
string imageFilePath = ImagePathTextBox.Text;
if (!File.Exists(imageFilePath))
{
ResultTextBlock.Text = "请输入有效的图片文件路径。";
return;
}
var regions = new List<int[]>();
regions.Add(ParseRegion(Region1TextBox.Text));
regions.Add(ParseRegion(Region2TextBox.Text));
var data = new List<string[]>();
foreach (var region in regions)
{
var ocrText = await TencentOCRHelper.OCRImage(imageFilePath, region);
data.Add(ocrText);
}
ExportToExcel(data);
ResultTextBlock.Text = "处理完成,结果已导出到 Excel 文件。";
}
private int[] ParseRegion(string regionText)
{
var parts = regionText.Split(',');
if (parts.Length!= 4)
{
throw new ArgumentException("区域输入格式错误,请输入 x,y,width,height。");
}
return new int[] { int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]) };
}
private void ExportToExcel(List<string[]> data)
{
using (var workbook = new XLWorkbook())
{
var worksheet = workbook.Worksheets.Add("OCR Results");
for (int i = 0; i < data.Count; i++)
{
for (int j = 0; j < data[i].Length; j++)
{
worksheet.Cell(i + 1, j + 1).Value = data[i][j];
}
}
string outputFilePath = @"C:\path\to\your\output\file.xlsx"; // 替换为你的输出 Excel 文件路径
workbook.SaveAs(outputFilePath);
}
}
}
}
代码解释
MainWindow.xaml:
- 包含一个简单的界面布局,用户可以输入图片路径和多个区域信息,点击按钮开始 OCR 操作。
TencentOCRHelper.cs:
- OCRImage 方法:
- 生成签名并添加到请求头。
- 裁剪图像指定区域。
- 将裁剪后的图像转换为 Base64 编码。
- 发送 POST 请求到腾讯 OCR API,并解析 JSON 响应。
- GenerateSignature 方法:
- 根据腾讯的签名算法生成签名,这里只是一个示例,你需要根据腾讯的文档实现具体逻辑。
- CropImage 方法:
- 根据输入的区域信息裁剪图像。
- ComputeHash 方法:
- 计算签名的哈希值,这里使用 SHA256 作为示例。
MainWindow.xaml.cs:
- Button_Click 方法:
- 从文本框获取图片路径和区域信息。
- 调用
TencentOCRHelper.OCRImage对每个区域进行 OCR 识别。 - 调用
ExportToExcel导出结果到 Excel。
- ParseRegion 方法:
- 将输入的区域文本解析为
int[]数组。
- 将输入的区域文本解析为
- ExportToExcel 方法:
- 使用
ClosedXML创建 Excel 工作簿,将 OCR 结果存储在工作表中。
- 使用
运行和测试
- 打开 Visual Studio,创建一个新的 WPF 项目,将上述代码复制到相应的文件中。
- 确保已安装所需的 NuGet 包。
- 替换
API_Key和Secret_Key为你在腾讯云获取的真实密钥。 - 替换
OCR_URL为腾讯 OCR 的实际 API 地址。 - 运行项目,输入图片路径和区域信息,点击按钮开始处理。
注意事项
- API 调用限制:腾讯 API 可能会有调用次数限制,根据你的套餐不同而不同,确保不超过限制。
- 区域输入:确保区域输入格式正确,如
x,y,width,height。 - 签名生成:确保
GenerateSignature方法符合腾讯的签名要求。 - 图像格式:确保输入的图像文件存在且可读取。
通过上述步骤,你可以实现一个使用 WPF 和腾讯 API 的图片文档指定区域文字识别工具,并将多位置信息保存到 Excel。根据实际需求,你可以进一步扩展和优化代码,以处理更复杂的场景。请根据腾讯的官方文档完善 GenerateSignature 方法和 OCR_URL 的设置,以确保 API 调用的正确性。
更多推荐

所有评论(0)