Программа для распознавания qr-кодов по картинке в формате bmp

Способ описанный выше конечно удобнее и куда проще, но не актуален для Delphi7, которая и была собственно заявлена в задании, однако эта проблема решаема.

Ещё один способ распознавания QR-кодов (штрих-кодов) в Delphi.

В таком варианте наиболее заинтересованы те пользователи, кто пишет свои приложения на Delphi 7, потому как описанный выше способ распознавания ZXing работает на Delphi (Rad studio) XE7 - 10 Rio.

В основу данного способа ложится использование двух библиотек, таких как

ZBar

и

PNGImage

.

Библиотека ZBar - это программный пакет с открытым исходным кодом для чтения штрих-кодов из различных источников, таких как видео-потоки, файлы изображений и необработанные датчики интенсивности. Он поддерживает многие популярные символы (типы штрих-кодов), включая EAN-13 / UPC-A, UPC-E, EAN-8, код 128, код 39, чередование 2 из 5 и QR-код.

Скачать компонент можно

тут

. В настоящее время доступна версия zbar-0.10.

Библиотека PNGImage - необходима чтобы расширить немного варианты использования форматов, которые можно загрузить и распознать, ввиду того что в Delphi7 поддержка данного формата не реализована. Она имеет полную реализацию формата PNG с открытым исходным кодом в Delphi.

Скачать компонент можно

тут

.

Покопавшись в сети, нашел исходники, довёл их немного до ума, и получилось небольшое приложение.

Исходный код:

DelphiВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Jpeg;
 
type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    GroupBox1: TGroupBox;
    Image1: TImage;
    GroupBox2: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    GroupBox3: TGroupBox;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses pngimage;
{$R .dfm}
 
function GetDosOutput(const CommandLine,Parametrs:string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, Line: String;
begin
  Application.ProcessMessages;
  with SA do
    begin
      nLength := SizeOf(SA);
      bInheritHandle := True;
      lpSecurityDescriptor := nil;
    end;
  // Создаём пайп для перенаправления стандартного вывода
  CreatePipe(StdOutPipeRead,  // дескриптор чтения
             StdOutPipeWrite, // дескриптор записи
             @SA,              // атрибуты безопасности
             0                // количество байт принятых для пайпа - 0 по умолчанию
             );
  try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    with SI do
      begin
        FillChar(SI, SizeOf(SI), 0);
        cb := SizeOf(SI);
        dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
        wShowWindow := SW_HIDE;
        hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем
        hStdOutput := StdOutPipeWrite;
        hStdError := StdOutPipeWrite;
      end;
    // Запускаем компилятор из командной строки
    WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess(nil,
                           PChar(CommandLine+' '+Parametrs),
                           nil,
                           nil,
                           True,
                           0,
                           nil,
                           PChar(WorkDir),
                           SI,
                           PI);
    // Теперь, когда дескриптор получен, для безопасности закрываем запись
    // Для того, чтобы произошло случайное чтение или запись
    CloseHandle(StdOutPipeWrite);
    // Если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then //raise Exception.Create('Could not execute command line!')
    else
      try
        // Получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
        Line := '';
        repeat
          Application.ProcessMessages;
          // Считываем блок символов (могут содержать возвраты каретки и переводы строки)
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          // Проверяем есть ли что-нибудь ещё для чтения
          if BytesRead > 0 then
            begin
              // Завершаем буфер PChar-ом
              Buffer[BytesRead] := #0;
              // Добавляем буфер в общий вывод
              Line := Line + Buffer;
            end;
        until not WasOK or (BytesRead = 0);
        // Ждём, завершения консольного приложения
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    result:= utf8toansi(Line); // Перекодируем UTF-8 в ANSI
    CloseHandle(StdOutPipeRead);
  end;
end;
 
  //Записываем в Memo1 результаты, полученные при обработке изображения zbarimg.exe
procedure TForm1.Button1Click(Sender: TObject);
begin
     memo1.Text:= GetDosOutput(extractfilepath(paramstr(0)) + 'zbarimg.exe', (OpenDialog1.FileName))
end;
   //Открываем графический файл с QR кодом, после его открытия станет доступна кнопка "Распознать"
procedure TForm1.Button2Click(Sender: TObject);
begin
   if OpenDialog1.Execute then Image1.Picture.LoadFromFile(OpenDialog1.FileName);
   Button1.Enabled:= true;
end;
 
end.

Проект -

Zbar_QR_code_reader

. Установка дополнительных компонентов не требуется. Библиотеки находятся в папке с проектом. Внутри архива есть уже готовый скомпилированный проект.