Dekodowanie kodu AZTEC 2D z dowodu rejestracyjnego

Oferujemy Państwu bibliotekę programistyczną oraz usługę sieciową pozwalającą zdekodować dane z kodu AZTEC 2D zapisanego w dowodach rejestracyjnych pojazdów samochodowych.

Kod AZTEC 2D w dowodzie rejestracyjnym

Nasza biblioteka dekoduje dane z dowodu rejestracyjnego, zapisane w postaci kodu obrazkowego tzw. kod aztec. Dekodowane są wszystkie wymienione pola w dowodzie rejestracyjnym pojazdu.

Dla kogo to jest?

Dekoder AZTec może przydać się firmom i instytucjom, które pragną zautomatyzować proces ręcznego wprowadzania danych z dowodów rejestracyjnych i zastąpić go poprzez wykorzystanie naszej biblioteki programistycznej, która potrafi rozpoznać i rozkodować kody AZTEC 2D bezpośrednio ze zdjęć dowodów rejestracyjnych lub zeskanowanych już kodów (wykorzystując skaner QR / AZTEC 2D).

  • dla firm ubezpieczeniowych
  • dla banków
  • dla warsztatów samochodowych
  • dla instytucji państwowych
  • dla producentów oprogramowania

Dostępne edycje programistyczne

Dekoder AZTec dostępny jest w trzech edycjach. Każda wersja posiada inne cechy i inne możliwości dekodowania. Wersja oparta o Web API jako jedyna posiada możliwość rozpoznawania i dekodowania danych bezpośrednio ze zdjęć i obrazków. Pozostałe wersje do dekodowania wymagają już odczytanego kodu w postaci tekstu (np. ze skanera).

Wersja Web API

Dekodowanie kodu AZTEC 2D do formatu JSON.Jest to najbardziej zaawansowana edycja Dekodera AZTec, ponieważ umożliwia precyzyjne rozpoznawanie i dekodowanie kodów AZTEC 2D bezpośrednio ze zdjęć oraz obrazków zapisanych w formatach PNG lub JPG.

Algorytm rozpoznawania obrazu należy do naszej firmy, jest to innowacyjne rozwiązanie rozwijane od podstaw przez prawie rok czasu.

Rozumiemy potrzeby naszych klientów oraz problemy wynikające z rozpoznawania rzeczywistych zdjęć kodów AZTEC 2D znajdujących się w dowodach rejestracyjnych, które nie zawsze są idealnie wykonane, czy to ze względu na rodzaj aparatu, kąta wykonania zdjęcia, refleksów czy słabej rozdzielczości.

Przy tworzeniu naszego rozwiązania wzięliśmy wszystkie te czynniki pod uwagę i w efekcie nasz algorytm radzi sobie znakomicie z rozpoznawaniem kodów AZTEC 2D ze zdjęć z wszelkiego rodzaju zniekształceniami, uszkodzeniami i niedoskonałościami. Znacznie przewyższa pod względem funkcjonowania dostępne na rynku biblioteki rozpoznawania kodów AZTEC 2D takie jak np. ZXing.

Instalacja

Dla ułatwienia szybkiego wdrożenia, paczki instalacyjne Dekodera AZTec zostały wgrane na repozytoria dla kilku popularnych języków programowania, a dodatkowo ich kody źródłowe zostały opublikowane na GitHubie.

Przykłady użycia Web API

  • Java
  • JavaScript
  • C#
  • PHP
  • Python
//
// załącz klasę dekodera (dostępna jako zależność systemu Maven)
//
import com.pelock.AZTecDecoder;
import org.json.JSONObject;

public static void main(String[] args)
{
	// utwórz klasę dekodera (używamy naszego klucza licencyjnego do inicjalizacji)
	AZTecDecoder myAZTecDecoder = new AZTecDecoder("ABCD-ABCD-ABCD-ABCD");

	//
	// 1. Dekoduj dane bezpośrednio z pliku graficznego, zwróć wynik jako tablicę
	//
	JSONObject DecodedArray = myAZTecDecoder.DecodeImageFromFile("C:\\zdjecie-dowodu.jpg");

	// czy udało się zdekodować dane?
	if (DecodedArray != null && (Boolean)DecodedArray.get("Status") == true)
	{
		// wyświetl rozkodowane dane (są zapisane jako tablica asocjacyjna)
		System.out.println(DecodedArray.toString(4));
	}

	//
	// 2. Dekoduj dane bezpośrednio z pliku graficznego i zwróć wynik jako string JSON
	//
	JSONObject DecodedJSON = myAZTecDecoder.DecodeImageFromFile("C:\\zdjecie-kodu-aztec-2d.png");

	if (DecodedJSON != null)
	{
		System.out.println(DecodedJSON.toString(4));
	}

	//
	// 3. Dekoduj dane z odczytanego już ciągu znaków (np. wykorzystując skaner ręczny)
	//
	// zakodowane dane z dowodu rejestracyjnego
	String szValue = "ggMAANtYAAJD...";

	JSONObject DecodedText = myAZTecDecoder.DecodeText(szValue);

	if (DecodedText != null)
	{
		System.out.println(DecodedText.toString(4));
	}

	//
	// 4. Dekoduj dane z odczytanego już ciągu znaków zapisanego w pliku (np. wykorzystując skaner ręczny)
	//
	JSONObject DecodedTextFile = myAZTecDecoder.DecodeTextFromFile("C:\\odczytany-ciag-znakow-aztec-2d.txt");

	if (DecodedTextFile != null)
	{
		System.out.println(DecodedTextFile.toString(4));
	}
}
//
// załącz moduł dekodera dla Node.js (instalacja komendą "npm install aztec-decoder")
//
var AZTecDecoder = require('aztec-decoder');

// inicjalizuj dekoder (używamy naszego klucza licencyjnego do inicjalizacji)
AZTecDecoder.SetApiKey("ABCD-ABCD-ABCD-ABCD");

//
// 1. Dekoduj dane bezpośrednio z pliku graficznego, zwróć wynik jako rozkodowaną tablicę elementów JSON
//
AZTecDecoder.DecodeImageFromFile("C:\\zdjecie-dowodu.jpg", function(DecodedArray) {

    // czy udało się zdekodować dane?
    if (DecodedArray !== null && DecodedArray["Status"] === true)
    {
        // wyświetl rozkodowane dane (są zapisane jako rozkodowana tablica elementów JSON)
        console.log(JSON.stringify(DecodedArray, null, "\t"));
    }
});

//
// 2. Dekoduj dane bezpośrednio z pliku graficznego i zwróć wynik jako rozkodowaną tablicę elementów JSON
//
AZTecDecoder.DecodeImageFromFile("C:\\zdjecie-kodu-aztec-2d.png", function(DecodedJSON) {

    if (DecodedJSON !== null)
    {
        console.log(JSON.stringify(DecodedJSON, null, "\t"));
    }
});

//
// 3. Dekoduj dane z odczytanego już ciągu znaków (np. wykorzystując skaner ręczny)
//
// zakodowane dane z dowodu rejestracyjnego
var szValue = "ggMAANtYAAJD...";

AZTecDecoder.DecodeText(szValue, function(DecodedText) {

    if (DecodedText !== null)
    {
        console.log(JSON.stringify(DecodedText, null, "\t"));
    }
});

//
// 4. Dekoduj dane z odczytanego już ciągu znaków zapisanego w pliku (np. wykorzystując skaner ręczny)
//
AZTecDecoder.DecodeTextFromFile("C:\\odczytany-ciag-znakow-aztec-2d.txt", function(DecodedTextFile) {

    if (DecodedTextFile !== null)
    {
        console.log(JSON.stringify(DecodedTextFile, null, "\t"));
    }
});
//
// załącz klasę dekodera (instalacja jako pakiet NuGet "PM> Install-Package AZTecDecoder")
//
using PELock;

private void AZTecDecoderTest()
{
    //
    // utwórz klasę dekodera (używamy naszego klucza licencyjnego do inicjalizacji)
    //
    var myAZTecDecoder = new AZTecDecoder("ABCD-ABCD-ABCD-ABCD");

    //
    // 1. Dekoduj dane bezpośrednio z pliku graficznego, zwróć wynik jako rozkodowaną tablicę elementów JSON
    //
    var decodedArray = myAZTecDecoder.DecodeImageFromFile(@"C:\sciezka\zdjecie-dowodu.jpg");

    // czy udało się zdekodować dane?
    if (decodedArray != null && decodedArray["Status"] == true)
    {
        // wyświetl rozkodowane dane (są zapisane jako tablica elementów JsonValue)
        textOutput.Text = decodedArray.ToString();
    }

    //
    // 2. Dekoduj dane bezpośrednio z pliku graficznego i zwróć wynik jako rozkodowaną tablicę elementów JSON
    //
    var decodedFromImage = myAZTecDecoder.DecodeImageFromFile(@"C:\sciezka\zdjecie-kodu-aztec-2d.png");

    if (decodedFromImage != null)
    {
        MessageBox.Show(decodedFromImage.ToString());
    }

    //
    // 3. Dekoduj dane z odczytanego już ciągu znaków (np. wykorzystując skaner ręczny)
    //
    // zakodowane dane z dowodu rejestracyjnego
    var szValue = "ggMAANtYAAJD...";

    var decodedText = myAZTecDecoder.DecodeText(szValue);

    if (decodedText != null)
    {
        MessageBox.Show(decodedFromImage.ToString());
    }

    //
    // 4. Dekoduj dane z odczytanego już ciągu znaków zapisanego w pliku (np. wykorzystując skaner ręczny)
    //
    var DecodedTextFile = myAZTecDecoder.DecodeTextFromFile(@"C:\sciezka\odczytany-ciag-znakow-aztec-2d.txt");

    if (DecodedTextFile != null)
    {
        MessageBox.Show(DecodedTextFile.ToString());
    }
}
//
// załącz klasę dekodera (instalacja komendą 'php composer.phar require --prefer-dist pelock/aztec-decoder "*"')
//
include_once "AZTecDecoder.php";

//
// utwórz klasę dekodera (używamy naszego klucza licencyjnego do inicjalizacji)
//
$myAZTecDecoder = new PELock\AZTecDecoder("ABCD-ABCD-ABCD-ABCD");

//
// 1. Dekoduj dane bezpośrednio z pliku graficznego, zwróć wynik jako tablicę
//
$DecodedArray = $myAZTecDecoder->DecodeImageFromFile("zdjecie-dowodu.jpg");

// czy udało się zdekodować dane?
if ($DecodedArray !== false && $DecodedArray["Status"] === true)
{
	// wyświetl rozkodowane dane (są zapisane jako tablica asocjacyjna)
	var_dump($DecodedArray);
}

//
// 2. Dekoduj dane bezpośrednio z pliku graficznego i zwróć wynik jako string JSON
//
$DecodedJSON = $myAZTecDecoder->DecodeImageFromFile("zdjecie-kodu-aztec-2d.png", false);

if ($DecodedJSON !== false)
{
	echo $DecodedJSON;
}

//
// 3. Dekoduj dane z odczytanego już ciągu znaków (np. wykorzystując skaner ręczny)
//
$DecodedText = $myAZTecDecoder->DecodeText("ggMAANtYAAJD...");

if ($DecodedText !== false)
{
	var_dump($DecodedText);
}

//
// 4. Dekoduj dane z odczytanego już ciągu znaków zapisanego w pliku (np. wykorzystując skaner ręczny)
//
$DecodedTextFile = $myAZTecDecoder->DecodeTextFromFile('/sciezka/odczytany-ciag-znakow-aztec-2d.txt');

if ($DecodedTextFile !== false)
{
	var_dump($DecodedTextFile);
}
#
#  załącz moduł dekodera (instalacja komendą "pip install aztecdecoder")
#
from pelock import aztecdecoder
from pprint import pprint

# utwórz klasę dekodera (używamy naszego klucza licencyjnego do inicjalizacji)
aztec_decoder = aztecdecoder.AZTecDecoder("ABCD-ABCD-ABCD-ABCD")

#
# 1. Dekoduj dane bezpośrednio z pliku graficznego, zwróć wynik jako rozkodowaną tablicę elementów JSON
#
decoded_array = aztec_decoder.decode_image_from_file("C:\\sciezka\\zdjecie-dowodu.jpg")

# czy udało się zdekodować dane?
if decoded_array and "Status" in decoded_array:

    # wyświetl rozkodowane dane (są zapisane jako rozkodowana tablica elementów JSON)
    pprint(decoded_array)

#
# 2. Dekoduj dane bezpośrednio z pliku graficznego i zwróć wynik jako rozkodowaną tablicę elementów JSON
#
decoded_json = aztec_decoder.decode_image_from_file("C:\\sciezka\\zdjecie-kodu-aztec-2d.png")

if decoded_json:

    pprint(decoded_json)

#
# 3. Dekoduj dane z odczytanego już ciągu znaków (np. wykorzystując skaner ręczny)
#
# zakodowane dane z dowodu rejestracyjnego
value = "ggMAANtYAAJD...";

decoded_text = aztec_decoder.decode_text(value)

if decoded_text:

    pprint(decoded_text)

#
# 4. Dekoduj dane z odczytanego już ciągu znaków zapisanego w pliku (np. wykorzystując skaner ręczny)
#
decoded_text_file = aztec_decoder.decode_text_from_file('C:\\sciezka\\odczytany-ciag-znakow-aztec-2d.txt')

if decoded_text_file:

    pprint(decoded_text_file)

Wersja z kodami źródłowymi oraz binarna

Biblioteka dostępna jest w wersji binarnej dla systemu Windows (DLL w wersji 32 i 64 bitowej) i może być wykorzystywana w dowolnych językach programowania obsługujących pliki DLL.

Oprócz tego przygotowane zostały natywne wersje z kodami źródłowymi w wybranych językach programowania. Warto nadmienić, że natywne implementacje nie są zależne od żadnych zewnętrznych bibliotek i referencji.

Biblioteka posiada tylko jedną funkcję dekodującą, na wejściu pobierany jest zeskanowany ciąg ASCII kodu AZTEC 2D, na wyjściu zwracany jest ciąg UNICODE pliku XML zawierającego wszystkie rozkodowane dane (w tym osobowe, czego inne biblioteki nie zwracają). Wersja w PHP potrafi także zwrócić dane w formacie JSON.

Szeroka oferta opcji programistycznych pozwala na wykorzystanie biblioteki na wielu platformach sprzętowych i systemach operacyjnych, takich jak Windows, Linux, OSX, iOS, Android.

Język programowania Binaria Źródła
Języka programowania Java Java Cross Tick
Języki programowania Delphi i Pascal Delphi / Pascal Tick Tick
Języki programowania Visual Basic i VBA Visual Basic / VBA Tick Cross
Języki programowania C i C++ C / C++ Tick Tick
Język programowania C# Sharp C# Tick Cross
Język programowania PHP PHP Tick Tick
Język programowania Python Python Cross Tick
Język programowania Ruby Ruby Cross Tick

Jeśli interesują Państwa natywne porty dla innych języków programowania – prosimy o kontakt.

Przykłady użycia

Biblioteka deszyfrująca może być dostosowana do dowolnego języka programowania, kilka przykładów użycia:

  • Java
  • Delphi / Pascal
  • Visual Basic / VBA
  • C
  • C / C++
  • C#
  • PHP
  • Python
  • Ruby
public static void main(String[] args)
{
	// utwórz klasę dekodera
	com.AZTecDecoder.AZTecDecoder myAZTecDecoder = new com.AZTecDecoder.AZTecDecoder();

	// zakodowane dane z dowodu rejestracyjnego
	String szValue = "gQMAANtYA...";

	// dekoduj dane
	String szDecoded = myAZTecDecoder.DecodeValue(szValue);

	// wyświetl rozkodowane dane w formie zrzutu XML
	System.out.print(szDecoded);
}
// deklaracja funkcji dekodującej dla Delphi
function DecodeValue(Value: WideString): WideString; stdcall; external 'AZTecDecoder.dll';

procedure TFormMain.ButtonDekodujClick(Sender: TObject);
var
  DecodedXml: WideString;
begin

  // zdekoduj dane (pobierz z kontrolki Memo)
  Decoded := DecodeValue(MemoZakodowane.Text);

  // jeśli błąd dekodowania wyjdź
  if Decoded = '' then Exit;

  // zapisz wynikowy ciąg XML do pliku
  WStrToFile('XmlUnicode.xml', Decoded);

end;
' deklaracja funkcji dekodującej dla Visual Basic / VBA
Private Declare Function DecodeValueVBA Lib "AZTecDecoder.dll" (ByVal Value As String, ByRef Output As String) As Integer

Sub AztecDecoder_Test()

  Dim Value As String
  Dim Xml As String
  Dim Result As Integer
    
  ' Zakodowane dane z dowodu rejestracyjnego
  Value = "gQMAANtYA..."

  ' Dekoduj dane
  Result = DecodeValueVBA(Value, Xml)

  ' Wyświetl zdekodowane dane w formacie XML
  MsgBox (Xml)

End Sub
#include "AZTecDecoder.h"

int main(void)
{
	/* zakodowane dane z dowodu rejestracyjnego */
	const wchar_t wszValue[] = L"gQMAANtYA...";

	/* wskaźnik na bufor, gdzie znajdą się zdekodowane dane */
	wchar_t *wszDecoded = NULL;

	/* dekoduj dane z postaci tekstowej do wyjściowego XML-a */
	wszDecoded = DecodeValue(wszValue);

	/* jeśli dekodowanie się udało, wyświetl rozkodowane */
	/* informacje w formie zrzutu XML */
	if (wszDecoded != NULL)
	{
		wprintf(wszDecoded);

		/* zwolnij bufor pamięci z wyjściowymi danymi */
		free(wszDecoded);
	}
	else
	{
		wprintf(L"Nie udało się rozkodować danych!");
	}

	return 0;
}
#define UNICODE
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>
#include <conio.h>

#include "AZTecDecoder.h"

int DekoderTest()
{
	HMODULE hAZTecDecoder = NULL;
	DECODEVALUECPPSIZE pDecodeValueCPPSize = NULL;
	DECODEVALUECPP pDecodeValueCPP = NULL;

	unsigned int dwBufferSize = 0;
	unsigned int dwResult = 0;

	wchar_t wszValue[] = _T("gQMAANtYA...");
	wchar_t *wszXml = NULL;

	// załaduj bibliotekę dekodera
	hAZTecDecoder = LoadLibrary(_T("AZTecDecoder.dll"));

	pDecodeValueCPPSize = (DECODEVALUECPPSIZE)GetProcAddress(hAZTecDecoder, "DecodeValueCPPSize");
	pDecodeValueCPP = (DECODEVALUECPP)GetProcAddress(hAZTecDecoder, "DecodeValueCPP");

	// pobierz rozmiar bufora na wyjściowy XML
	dwBufferSize = pDecodeValueCPPSize(wszValue);

	if (dwBufferSize == 0) return 1;

	// alokuj pamięć na bufor wyjściowy XML
	wszXml = malloc(sizeof(wchar_t) * dwBufferSize);

	// dekoduj dane
	dwResult = pDecodeValueCPP(wszValue, wszXml);

	// jeśli dekodowanie się udało, wyświetl XML
	if (dwResult == 0)
	{
		wprintf(wszXml);

		// zwolnij pamięć
		free(wszXml);

		return 0;
	}

	// zwolnij pamięć
	free(wszXml);

	return 1;
}
	[DllImportAttribute("AZTecDecoder.dll", EntryPoint = "DecodeValueCPPSize", CallingConvention = CallingConvention.StdCall)]
	public static extern int DecodeValueCPPSize(byte[] wszValue);

	[DllImportAttribute("AZTecDecoder.dll", EntryPoint = "DecodeValueCPP", CallingConvention = CallingConvention.StdCall)]
	public static extern int DecodeValueCPP(byte[] wszValue, byte[] wszOutputXml);
	
	private void buttonDecode_Click(object sender, EventArgs e)
	{
		// zakodowane dane w formacie ASCII
		string szValue = textInput.Text;

		textOutput.Text = "";

		UnicodeEncoding UNICODE = new UnicodeEncoding();

		// skonwertuj dane wejsciowe do formatu UNICODE
		byte[] wszValue = UNICODE.GetBytes(szValue);

		// pobierz rozmiar bufora na wyjściowy XML
		int dwBufferSize = DecodeValueCPPSize(wszValue);

		// jesli zwrocony rozmiar jest pusty, dane wejsciowe
		// mogly byc w nieprawidlowym formacie
		if (dwBufferSize == 0)
		{
			MessageBox.Show("Nieprawidłowy format danych!");
			return;
		}

		// alokuj pamięć na bufor wyjściowy XML
		byte[] lpcDecodedData = new byte[dwBufferSize];

		// dekoduj dane
		int dwResult = DecodeValueCPP(wszValue, lpcDecodedData);

		// jeśli dekodowanie się udało, wyświetl rozkodowane
		// informacje w formie zrzutu XML
		if (dwResult == 0)
		{
			string szXml = UNICODE.GetString(lpcDecodedData);
			
			textOutput.Text = szXml;
		}
		else
		{
			MessageBox.Show("Nie udało się rozkodować danych!");
			return;
		}
	}
<?php

	include_once "AZTecDecoder.php";

	// utwórz klasę dekodera
	$myAZTecDecoder = new AZTecDecoder();

	// zakodowane dane z dowodu rejestracyjnego
	$szValue = "gQMAANtYA...";

	// czy rozkodowane dane mają być zwrócone w formie XML lub JSON
	$bJson = false;

	// dekoduj dane
	$szDecoded = $myAZTecDecoder->DecodeValue($szValue, $bJson);

	// jeśli dane zostały zdekodowane do formatu XML
	// wyślij do przeglądarki odpowiedni nagłówek XML
	if ($bJson == false)
	{
		header("Content-type: text/xml; charset=utf-8");
	}

	// wyświetl rozkodowane dane
	echo $szDecoded;
?>
    import AZTecDecoder

    # utwórz klasę dekodera
    myAZTecDecoder = AZTecDecoder.AZTecDecoder()

    # zakodowane dane z dowodu rejestracyjnego
    szValue = "gQMAANtYA..."

    # dekoduj dane
    szDecoded = myAZTecDecoder.DecodeValue(szValue)

    # jeśli dekodowanie się udało, wyświetl rozkodowane
    # informacje w formie zrzutu XML
    if szDecoded:
        print szDecoded
    else:
        print "Nie udało się rozkodować danych!"
load 'AZTecDecoder.rb'

# utwórz klasę dekodera
aztec_decoder = AZTecDecoder.new
 
# zakodowane dane z dowodu rejestracyjnego
value = "gQMAANtYA..."
 
# dekoduj dane
decoded = aztec_decoder.DecodeValue(value)
 
# jeśli dekodowanie się udało, wyświetl rozkodowane
# informacje w formie zrzutu XML
if decoded.to_s != ''
  puts decoded
else
  puts "Nie udalo sie rozkodowac danych!"
end

Za dodatkową opłatą jesteśmy w stanie wykonać dowolną implementację dla innych języków programowania.

Dlaczego warto wybrać nasze rozwiązanie?

  • natywne porty w wielu językach programowania
  • prostota użycia, brak zewnętrznych zależności programistycznych
  • możliwość zakupu kodu źródłowego biblioteki
  • dekodowanie danych osobowych, danych właściciela pojazdu
  • konkurencyjna cena i wieczysta licencja (NIE trzeba odnawiać co roku!)
  • wsparcie techniczne
  • możliwość implementacji dla dowolnego języka programowania
  • możliwość implementacji dla różnych systemów (Windows, Linux, Android)
  • wystawiamy faktury

Cyfrowy podpis

CertyfikatNasza biblioteka posiada cyfrowy podpis kodu (dotyczy systemu Windows), co oznacza, że pochodzi ze zweryfikowanego źródła, nasza firma musiała przejść przez proces weryfikacyjny, przedstawiając dokumenty świadczące o legalności prowadzonych działań.

Demo

Jeśli chcieliby Państwo sprawdzić poprawność danych, prosimy przesłać na adres kontaktowy zrzut danych w formie ASCII, a prześlemy zdekodowane informacje w formie XML.

Na naszej stronie firmowej udostępniliśmy także interfejs online pozwalający przetestować dekodowanie danych bezpośrednio z obrazków i z już odczytanych kodów.

https://www.pelock.com/pl/produkty/dekoder-aztec/online

Kontakt

Jeśli są Państwo zainteresowani zakupem licencji lub mają Państwo jakieś pytania – prosimy o kontakt.