基于阿里云的图片识别,区域OCR识别与自动重命名方案
项目场景
电商商品管理:批量处理商品图片,从固定区域识别商品名称、型号、价格等信息,重命名为"商品名称_型号_价格.jpg"格式,档案数字化:扫描后的合同、文件等图片,从固定位置识别合同编号、日期等关键信息进行重命名,物流单据管理:识别货运单上的车号、批次号等信息,重命名图片以便快速检索,财务票据处理:从发票固定区域识别发票号码、金额等信息进行文件命名
界面设计
<Window x:Class="AliyunOCRRenamer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="OCR图片识别重命名工具" Height="550" Width="800">
<Grid>
<!-- 文件选择区域 -->
<Button Content="选择图片文件夹" HorizontalAlignment="Left" Margin="20,20,0,0" VerticalAlignment="Top" Width="150" Click="SelectImageFolder_Click"/>
<TextBox x:Name="ImageFolderTextBox" HorizontalAlignment="Left" Height="23" Margin="180,20,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="580" IsReadOnly="True"/>
<!-- 阿里云配置 -->
<Label Content="阿里云AccessKey ID:" HorizontalAlignment="Left" Margin="20,60,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="AccessKeyTextBox" HorizontalAlignment="Left" Height="23" Margin="150,60,0,0" VerticalAlignment="Top" Width="200"/>
<Label Content="阿里云AccessKey Secret:" HorizontalAlignment="Left" Margin="20,90,0,0" VerticalAlignment="Top"/>
<PasswordBox x:Name="AccessSecretBox" HorizontalAlignment="Left" Height="23" Margin="150,90,0,0" VerticalAlignment="Top" Width="200"/>
<!-- 区域设置 -->
<Label Content="识别区域设置(格式:left,top,width,height)" HorizontalAlignment="Left" Margin="20,130,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="RegionTextBox" HorizontalAlignment="Left" Height="23" Margin="20,160,0,0" VerticalAlignment="Top" Width="740" Text="100,100,200,50"/>
<!-- 预览区域 -->
<Image x:Name="PreviewImage" HorizontalAlignment="Left" Margin="20,200,0,0" VerticalAlignment="Top" Width="300" Height="200"/>
<Button Content="选择预览图片" HorizontalAlignment="Left" Margin="20,410,0,0" VerticalAlignment="Top" Width="100" Click="SelectPreviewImage_Click"/>
<!-- 处理控制 -->
<Button Content="开始处理" HorizontalAlignment="Left" Margin="350,450,0,0" VerticalAlignment="Top" Width="100" Click="StartProcessing_Click"/>
<!-- 日志输出 -->
<TextBox x:Name="LogTextBox" HorizontalAlignment="Left" Height="100" Margin="400,200,0,0" VerticalAlignment="Top" Width="360" IsReadOnly="True" VerticalScrollBarVisibility="Auto"/>
</Grid>
</Window>
详细实现步骤
1. 环境准备
- 安装Visual Studio并创建WPF项目
- 通过NuGet安装阿里云SDK:
Install-Package Aliyun.SDK.OCR-20191230
- 在阿里云控制台开通OCR服务并获取AccessKey ID和Secret
2. 核心代码实现
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.OCR.Model.V20191230;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows;
using System.Windows.Media.Imaging;
namespace AliyunOCRRenamer
{
public partial class MainWindow : Window
{
private string imageFolderPath;
public MainWindow()
{
InitializeComponent();
}
private void SelectImageFolder_Click(object sender, RoutedEventArgs e)
{
var dialog = new System.Windows.Forms.FolderBrowserDialog();
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
imageFolderPath = dialog.SelectedPath;
ImageFolderTextBox.Text = imageFolderPath;
}
}
private void SelectPreviewImage_Click(object sender, RoutedEventArgs e)
{
var dialog = new Microsoft.Win32.OpenFileDialog();
dialog.Filter = "Image files (*.jpg, *.jpeg, *.png)|*.jpg;*.jpeg;*.png";
if (dialog.ShowDialog() == true)
{
PreviewImage.Source = new BitmapImage(new Uri(dialog.FileName));
}
}
private void StartProcessing_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(imageFolderPath))
{
MessageBox.Show("请先选择图片文件夹");
return;
}
// 获取阿里云配置
string accessKeyId = AccessKeyTextBox.Text;
string accessKeySecret = AccessSecretBox.Password;
if (string.IsNullOrEmpty(accessKeyId) || string.IsNullOrEmpty(accessKeySecret))
{
MessageBox.Show("请输入阿里云AccessKey ID和Secret");
return;
}
// 解析识别区域
var regionParts = RegionTextBox.Text.Split(',');
if (regionParts.Length != 4)
{
MessageBox.Show("识别区域格式不正确,应为left,top,width,height");
return;
}
int left = int.Parse(regionParts[0]);
int top = int.Parse(regionParts[1]);
int width = int.Parse(regionParts[2]);
int height = int.Parse(regionParts[3]);
// 获取所有图片文件
var imageFiles = Directory.GetFiles(imageFolderPath, "*.*", SearchOption.AllDirectories)
.Where(file => file.ToLower().EndsWith(".jpg") ||
file.ToLower().EndsWith(".jpeg") ||
file.ToLower().EndsWith(".png")).ToList();
// 初始化阿里云客户端
IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 处理每张图片
foreach (var imageFile in imageFiles)
{
try
{
// 读取图片并转换为Base64
byte[] imageBytes = File.ReadAllBytes(imageFile);
string imageBase64 = Convert.ToBase64String(imageBytes);
// 创建OCR请求
var request = new RecognizeCharacterRequest();
request.ImageURL = "";
request.ImageData = imageBase64;
request.MinHeight = 10;
request.OutputProbability = false;
// 设置识别区域
request.Task = new List<RecognizeCharacterRequest.TaskItem>
{
new RecognizeCharacterRequest.TaskItem
{
ImageData = imageBase64,
RegionType = 1,
RegionInfo = new RecognizeCharacterRequest.TaskItemRegionInfo
{
Left = left,
Top = top,
Width = width,
Height = height
}
}
};
// 发送OCR请求
var response = client.GetAcsResponse(request);
if (response.Data != null && response.Data.Outputs != null && response.Data.Outputs.Count > 0)
{
// 获取识别结果
string recognizedText = response.Data.Outputs[0].OutputValue.DataValue;
// 清理文件名中的非法字符
string safeFileName = string.Join("_", recognizedText.Split(Path.GetInvalidFileNameChars()));
// 构建新文件名
string newFileName = $"{safeFileName}{Path.GetExtension(imageFile)}";
string newFilePath = Path.Combine(Path.GetDirectoryName(imageFile), newFileName);
// 处理文件名冲突
if (File.Exists(newFilePath))
{
newFileName = $"{safeFileName}_{Guid.NewGuid().ToString().Substring(0, 4)}{Path.GetExtension(imageFile)}";
newFilePath = Path.Combine(Path.GetDirectoryName(imageFile), newFileName);
}
// 重命名文件
File.Move(imageFile, newFilePath);
// 记录日志
LogTextBox.AppendText($"成功重命名: {Path.GetFileName(imageFile)} -> {newFileName}\n");
}
}
catch (Exception ex)
{
LogTextBox.AppendText($"处理文件 {Path.GetFileName(imageFile)} 时出错: {ex.Message}\n");
}
}
LogTextBox.AppendText("处理完成!\n");
}
}
}
总结与优化
优化建议
-
性能优化:
- 使用多线程或异步处理提高批量处理速度
- 对阿里云OCR接口进行批量化调用,减少网络请求次数
-
准确性提升:
- 添加图像预处理功能(如灰度化、二值化、锐化等)提高OCR识别率
- 实现多区域识别,综合多个区域的识别结果生成文件名
-
用户体验改进:
- 添加可视化区域选择功能,让用户可以直接在图片上框选识别区域
- 实现识别结果预览和手动修正功能
- 添加进度条显示处理进度
-
功能扩展:
- 支持PDF文件的区域识别和重命名
- 添加规则模板功能,保存常用识别区域配置
- 支持将识别结果导出为Excel表格
注意事项
- 阿里云OCR服务有调用频率限制,需注意处理大量文件时的限流问题
- 文件名长度限制为255字符,需对识别结果进行截断处理
- 图片质量直接影响识别准确率,建议处理前检查图片清晰度
- 阿里云OCR服务会产生费用,需注意成本控制
此方案结合了WPF的界面优势与阿里云OCR的强大识别能力,能够有效解决批量图片区域识别和重命名的需求,特别适合电商、档案管理等场景下的文件自动化处理工作