在市场调研方面,企业可能收集了数以万计来自不同渠道(如社交媒体、竞争对手网站等)的关于市场趋势、竞争对手产品等的图片。识别图片中的关键信息(如广告文案、产品新特性等)后改名,并将数据导出到表格,可以帮助企业深入分析市场动态,制定更有效的竞争策略。

以下是使用 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}&timestamp={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 结果存储在工作表中。

运行和测试

  1. 打开 Visual Studio,创建一个新的 WPF 项目,将上述代码复制到相应的文件中。
  2. 确保已安装所需的 NuGet 包。
  3. 替换 API_Key 和 Secret_Key 为你在腾讯云获取的真实密钥。
  4. 替换 OCR_URL 为腾讯 OCR 的实际 API 地址。
  5. 运行项目,输入图片路径和区域信息,点击按钮开始处理。

注意事项

  • API 调用限制:腾讯 API 可能会有调用次数限制,根据你的套餐不同而不同,确保不超过限制。
  • 区域输入:确保区域输入格式正确,如 x,y,width,height
  • 签名生成:确保 GenerateSignature 方法符合腾讯的签名要求。
  • 图像格式:确保输入的图像文件存在且可读取。

通过上述步骤,你可以实现一个使用 WPF 和腾讯 API 的图片文档指定区域文字识别工具,并将多位置信息保存到 Excel。根据实际需求,你可以进一步扩展和优化代码,以处理更复杂的场景。请根据腾讯的官方文档完善 GenerateSignature 方法和 OCR_URL 的设置,以确保 API 调用的正确性。

更多推荐