Jak wog�le taki kod wygenerowa�?
Pozdrawiam
Bartek
[...]
Zainteresuj sie kodem Kod128, a raczej jego odmianďż˝ gs1-128 (dawniej EAN128)
Na pocz�tek mo�esz zerkn�� na http://www.access.vis.pl/war308.htm, ale
przyk�ad ten traktuj jako pogl�dowy. Obs�uguje on niestety zbi�r B,
a Ty musisz zastosowa� zbi�r C.
Tu masz specyfikacjďż˝:
http://www.gs1pl.org/download/publikacje/ean128.pdf
a tutaj generator kodu na www:
http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php
ew. poszukaj gdzieďż˝ w sieci darmowego fontu Kod 128.
Mo�e Ci sie uda gdzie� znale��.
--
Pozdrowienia
BraZby
Zrobi� si� da. Pytanie tylko jak stworzysz numeracj�. Ja po d�ugich
poszukiwaniach kto w PP mo�e cho�by porozmawia� na temat wykorzystania
w�asnej numeracji, odkopa�em drukark� ig�ow� i korzystam nadal z
oryginalnych druk�w :)
Pozdrawiam,
TK
__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirus�w 4050 (20090503) __________
Wiadomosc zostala sprawdzona przez program ESET NOD32 Antivirus.
No tak, ale je�li mam przyznan� p�le numer�w?
To zadam zakres i potem niech leci kolejny wolny nr.
A mo�e kto� robi� ju� co� takiego? Mo�e ma gotowca?
Pozdrawiam
Auu! Co masz przyznane?
Je�li mia�by� PUL� i m�g�by� podes�a� nieco wi�cej informacji jak Ci si�
uda�o to za�atwi� by�bym zobowi�zany.
> To zadam zakres i potem niech leci kolejny wolny nr.
>
> A mo�e kto� robi� ju� co� takiego? Mo�e ma gotowca?
A z czym problem? Jak drukowaďż˝ kody koledzy podpowiedzieli. Ja mogďż˝
podpowiedzie� jak wyliczy� cyfr� kontroln�, �eby nie trzeba by�o r�cznie
wprowadza� przyznanej puli. Reszta to odpowiedni uk�ad raportu.
Pozdrawiam,
Kie�pi�
A podpowiedz bardzo ch�tnie, odrazu podaj maila, bo pr�bowa�em wys�a� info
na temat jak to zalatwi�em na priva, ale co� odrzuca.
Pozdrawiam
Bartek
"Pisz�c prywatnie usu� FALSZYWY z adresu."
Zmieni�em czytnik i na razie nie mam sygnaturki, gdzie to by�o napisane :)
Ale jak widz� poradzi�e� sobie.
Na prv wys�a�em arkusz Excelowy kt�rego u�ywam.
|| Robi� kto� mo�e kod kreskowy, czy wog�le da sie zrobi� co� takiego?
|| Chodzi mi o druki pocztowe : ADRES POMOCNICZY, PRZESY�KA POBRANIOWA.
||
|| Jak wog�le taki kod wygenerowa�?
|
| [...]
|
| Zainteresuj sie kodem Kod128, a raczej jego odmianďż˝ gs1-128 (dawniej
| EAN128)
|
| Na pocz�tek mo�esz zerkn�� na http://www.access.vis.pl/war308.htm, ale
| przyk�ad ten traktuj jako pogl�dowy. Obs�uguje on niestety zbi�r B,
| a Ty musisz zastosowa� zbi�r C.
|
| Tu masz specyfikacjďż˝:
| http://www.gs1pl.org/download/publikacje/ean128.pdf
|
| a tutaj generator kodu na www:
| http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php
Hmmm, nie sprawdza�em dog��bnie czym r�ni si� GS1-128 od Code128, ale
zdaje si�, �e jedynie znakiem specjalnym FNC1 zaraz po znaku Start.
Czyli chyba niewiele potrzeba aby dorobiďż˝ w moim module basBarcodesCode128
odpowiedni typ czy przerobiďż˝/zuniwersalizowaďż˝ funkcjďż˝
BarcodePatternCode128() tak aby zwraca�a odpowiedni "pattern" (znaczy
zero-jedynki do dalszej obr�bki)
Je�li tak, to prosz� o sugestie:
http://www.access.vis.pl/naworyta/knBarCodesV1.zip
--
KN
archiwum grupy:
http://groups.google.pl/advanced_group_search
(grupa: pl*msaccess)
> | Tu masz specyfikacjďż˝:
> | http://www.gs1pl.org/download/publikacje/ean128.pdf
> |
> | a tutaj generator kodu na www:
> | http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php
>
> Hmmm, nie sprawdza�em dog��bnie czym r�ni si� GS1-128 od Code128, ale
> zdaje si�, �e jedynie znakiem specjalnym FNC1 zaraz po znaku Start.
>
> Czyli chyba niewiele potrzeba aby dorobiďż˝ w moim module basBarcodesCode128
> odpowiedni typ czy przerobiďż˝/zuniwersalizowaďż˝ funkcjďż˝
> BarcodePatternCode128() tak aby zwraca�a odpowiedni "pattern" (znaczy
> zero-jedynki do dalszej obr�bki)
>
> Je�li tak, to prosz� o sugestie:
> http://www.access.vis.pl/naworyta/knBarCodesV1.zip
>
Znalaz�em gdzie� w sieci przyk�ad druku pocztowego z ADRESem POMOCNICZYm
i by� tam przyk�ad kodu paskowego dla warto�ci 00159007733000000005.
Ten kod paskowy generowany by� zestawem znak�w C.
Czy zawsze tak jest, nie wiem.
Bartek dosta� pul�, wi�c wie jakie tam s� znaki i jak je kodowa�.
By� mo�e mo�na kodowa� numery z puli Zbiorem B, ale czy
na pewno, tego nie wiem. Czytnik powinien odczyta� i Zbi�r B.
Innymi s�awami m�wi�c dla Zestawu C jeden znak kodu okre�la dwie cyfry.
Kod jest w tym konkretnym przypadku dwukrotnie zmniejszony
w/g http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php zapis jest
nast�puj�cy
StartC Fnc1 00 15 90 07 73 30 00 00 00 05 11 Stop
w sumie jest 10 znak�w danych + 3 znaki specjalne + 1 znak kontrolny
R�nice w d�ugo�ci kodu jest pokazana na:
http://www.bratki.w.v1.pl/tmp/Code128C.png
�rodkowy kod utworzony zosta� przez generator na stronie.
Pozosta�e dwa poprzez m�j testowy generator. Nie sprawdza�em moich kod�w
czytnikiem kod�w kreskowych, ale w por�wnaniu z kodem ze strony ju� widz�
ma�� r�nic� w szeroko�ci jednego paska. Czy jest to wina skalowania, czy
jaki� b��d musz� sprawdzi�. Kt�ry kod jest prawid�owy (a mo�e oba dobre)
zobaczymy p�niej.
--
Pozdrowienia
BraZby
(...)
||| Tu masz specyfikacjďż˝:
||| http://www.gs1pl.org/download/publikacje/ean128.pdf
|||
||| a tutaj generator kodu na www:
||| http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php
||
|| Hmmm, nie sprawdza�em dog��bnie czym r�ni si� GS1-128 od Code128, ale
|| zdaje si�, �e jedynie znakiem specjalnym FNC1 zaraz po znaku Start.
||
|| Czyli chyba niewiele potrzeba aby dorobiďż˝ w moim module
|| basBarcodesCode128 odpowiedni typ czy przerobiďż˝/zuniwersalizowaďż˝
|| funkcj� BarcodePatternCode128() tak aby zwraca�a odpowiedni "pattern"
|| (znaczy zero-jedynki do dalszej obr�bki)
||
|| Je�li tak, to prosz� o sugestie:
|| http://www.access.vis.pl/naworyta/knBarCodesV1.zip
| Znalaz�em gdzie� w sieci przyk�ad druku pocztowego z ADRESem
| POMOCNICZYm
| i by� tam przyk�ad kodu paskowego dla warto�ci 00159007733000000005.
| Ten kod paskowy generowany by� zestawem znak�w C.
| Czy zawsze tak jest, nie wiem.
W specyfikacji, do kt�rej poda�e� link�, wyra�nie m�wi�, �e to w zasadzie
program powinien sam optymalizowa� czy w Code128 zostanie u�yty typ A, B,
czy C.
Nawet podaj� og�lne wytyczne czym taki algorytm mia�by si� kierowa�.
Powiem szczerze, �e bardzo mnie to zainteresowa�o.
Pami�tamy oczywi�cie ca�y czas, �e w tym kodzie w ka�dej chwili mo�emy
prze��czy� si� mi�dzy typami lub po prostu u�y� SHIFT (dla pojedynczego
znaku).
Jest to do�� fajne wyzwanie, gdy ju� sam problem malowania kresek przesta�
byďż˝ tak istotny.
| Bartek dosta� pul�, wi�c wie jakie tam s� znaki i jak je kodowa�.
| By� mo�e mo�na kodowa� numery z puli Zbiorem B, ale czy
| na pewno, tego nie wiem. Czytnik powinien odczyta� i Zbi�r B.
|
| Innymi s�awami m�wi�c dla Zestawu C jeden znak kodu okre�la dwie cyfry.
| Kod jest w tym konkretnym przypadku dwukrotnie zmniejszony
| w/g http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php zapis jest
| nast�puj�cy
|
| StartC Fnc1 00 15 90 07 73 30 00 00 00 05 11 Stop
|
| w sumie jest 10 znak�w danych + 3 znaki specjalne + 1 znak kontrolny
|
| R�nice w d�ugo�ci kodu jest pokazana na:
| http://www.bratki.w.v1.pl/tmp/Code128C.png
Dla Code128 okre�la si� g�rn� granic� jako 16cm szeroko�ci i/lub 48 znak�w
(vide przytoczona przez Ciebie specyfikacja).
Jak d�ugo pierwszy i drugi spos�b kodowania nie przekrocza tej granicy,
dyskusja jest pewnie czysto akademicka.
Ale ta "akademicko��" te� jest ciekawa :)
Ko�cem nosa czuj�, �e optymalizacja sposobu kodowania (z u�yciem
prze��cznik�w) mo�e zahacza� o problem komiwoja�era, czyli w najlepszym
wypadku o algorytmy szacunkowe, bez pretensji do �cis�o�ci matematycznej.
Nadal jest to fajne wyzwanie.
Jeszcze inna ciekawostka, to sprawa umieszczania w jednym kodzie kilku
informacji.
Czyli (zn�w za specyfikacj�) np. kodu produktu, jego wagi czy ceny.
Wykorzysta� predefiniowane "d�ugo�ci" czy u�y� FNC1 jako rozdzielnika.
No i na koniec:
Czy znak Start + FNC1 (jako rozszerzony znak Start) wchodzi jako element
wyliczanej sumy kontrolnej czy nie?
Bo jako� nie znalaz�em tej informacji w specyfikacji.
Pomijaj�c wszystko co powy�sze, zapominaj�c o ewentualnych niuansach przy
wyliczaniu sumy kontrolnej, wydaje si�, �e spreparowany przeze mnie spos�b
malowania kodu jest do�� uniwersalny.
To, czego ewidentnie mu brakuje, to w zasadzie jedna funkcja
optymalizuj�ca wej�ciowy string.
Przyk�adowo:
Je�li na wej�ciu pojawi si� co� takiego:
000129943400037ABC345urt
to powinno to zostaďż˝ przekazane jako
typ C: 00 01 29 94 34 00 03
typ A: 7ABC345
typ B: urt
ale gdy tak juz to zostanie zrobione (przez u�ytkownika lub algorytmem) i
przekazane dalej, to moje modu�y powinny to �adnie wyrysowa�/wymalowa�.
Wracaj�c do rozdzielczo�ci...
swego czasu pow�tpiewa�e� czy moje jednopikselowe kody kreskowe z
w��czonym trybem rozszerzania obrazka przypadkiem czego� nie przek�ami�.
Na ekranie mo�e tak, mo�e nie. Ale z ekranu �aden czytnik niczego zczyta�
nie potrafi ;)
Za� na wydruku jako� zawsze si� to �wietnie spisywa�o.
|| Robi� kto� mo�e kod kreskowy, czy wog�le da sie zrobi� co� takiego?
|| Chodzi mi o druki pocztowe : ADRES POMOCNICZY, PRZESY�KA POBRANIOWA.
||
|| Jak wog�le taki kod wygenerowa�?
| Zrobi� si� da. Pytanie tylko jak stworzysz numeracj�. Ja po d�ugich
| poszukiwaniach kto w PP mo�e cho�by porozmawia� na temat wykorzystania
| w�asnej numeracji, odkopa�em drukark� ig�ow� i korzystam nadal z
| oryginalnych druk�w :)
O�wie�cie mnie, bo jestem poza tematem.
Co to sďż˝ te druki PP-77, PP-17
Jak do tego majďż˝ siďż˝
- kody kreskowe
- w�asna numeracja
- ADRES POMOCNICZY
- PRZESY�KA POBRANIOWA
czy
- drukarka ig�owa ?
Zainteresowa�o mnie to, ale googiel niczego sensownego mi nie pokaza� :(
W du�ym skr�cie:
- Adres pomocniczy to taki druczek, kt�ry trzeba wype�ni� nadaj�c paczk� na
poczcie.
(A drugi - je�li chcesz �eby odbiorca zap�aci� za przesy�k�.
- PP-77 i PP-17 to ich oficjalne symbole.
- Druczki s� samokopiuj�ce.
- Ka�dy druczek na sw�j w�asny indywidualny numer pod postaci� liczb i kodu
kreskowego
- Je�li dostaniesz w�asn� pul� numer�w mo�esz sam sobie takie druki
stworzyďż˝,
ale potrzebujesz czionki kodu kreskowego.
- A je�li puli nie masz, na gotowy druk z poczty wdrukowywujesz nadawc� i
adresata.
Poniewa� druk jest samokopiuj�cy, bez ig��wki ani rusz.
Pozdrawiam,
TK
__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirus�w 4054 (20090505) __________
(...)
Rozumiem. Dziwi mnie jednak, �e nigdzie nie mog� znale�� wzor�w takich
druczk�w (www).
Pewnie przejdďż˝ siďż˝ na pocztďż˝ :)
Z tego co widz�, PP rozpisa�a swego czasu przetarg na te formularze.
Rozumiem, �e mozna do nich wyst�pi� o "pul� numer�w" i wtedy drukujemy
sami?
Dbaj�c jedynie o unikalno�� ka�dego numeru?
[...]
>
> W specyfikacji, do kt�rej poda�e� link�, wyra�nie m�wi�, �e to w zasadzie
> program powinien sam optymalizowa� czy w Code128 zostanie u�yty typ A, B,
> czy C.
> Nawet podaj� og�lne wytyczne czym taki algorytm mia�by si� kierowa�.
> Powiem szczerze, �e bardzo mnie to zainteresowa�o.
[...]
Moim zdaniem Zestaw A jest zupe�nie spokojnie do odrzucenia,
chyba �e chcemy przekazywa� znaki steruj�ce. Ju� bardziej ciekawe jest
u�ycie Znaku FNC4 rozszerzaj�cego zakres o nast�pne 128.
Ale czy czytniki to ju� obs�uguj�, tego nie wiem.
Nie bardzo chce mi siďż˝ bawiďż˝ w takie optymalizowanie.
Tak najpro�ciej (moim zdaniem) to sprawdzamy ile jest *par* kolejnych
numerycznych znak�w. Piszemy "Code C" i przekazujemy pary znak�w,
potem "Code B" i ewentualnie ostatni nieparzysty znak i ci�g znak�w.
Pytanie, czy dla ci�gu Ala123Ula warto si� prze��cza�.
Ala123Ula
StartB A l a CodeC 12 CodeB 3 U l a - 11 znak�w
StartB A l a 1 2 3 U l a - 10 znak�w
Ala12345Ula
StartB A l a CodeC 12 34 CodeB 5 U l a - 12 znak�w
StartB A l a 1 2 3 4 5 U l a - 12 znak�w
lub. 12345
StartC 12 34 CodeB 5 - 5 znak�w
a mo�e wymusi�, a raczej je�eli jest to mo�liwe samemu to zrobi�, by przed
ostatnim nieparzystym znakiem dopisaďż˝ 0
12345 -->123405
StartC 12 34 05 - 4 znak�w
Oczywi�cie s� pu�apki dla ostatniego, tak zapisanego znaku,
Mo�emy tak�e w programie (je�eli mamy na to wp�yw) tworzy�
parzyst� ilo�� cyfr, no a je�eli nie to mo�na si� zastanowi�
czy walka o jeden, czy dwa znaki jest tak bardzo istotna,
aczkolwiek sama optymalizacja mo�e by� ciekawa.
[...]
>
> Pami�tamy oczywi�cie ca�y czas, �e w tym kodzie w ka�dej chwili mo�emy
> prze��czy� si� mi�dzy typami lub po prostu u�y� SHIFT (dla pojedynczego
> znaku).
No, nie bardzo, jedynie w obr�bie Zbior�w A i B:
<cyt>
a.. Znak Shift zmienia zestaw kodu A na B lub B na A dla jednego znaku
nast�puj�cego po znaku Shift. Znak nast�puj�cy po znaku, na kt�ry zadzia�a�
znak Shift wraca do zestawu kodu A lub B zdefiniowanego przed znakiem Shift.
</cyt>
W zestawie C nie ma znaku SHIFT.
>
> Jest to do�� fajne wyzwanie, gdy ju� sam problem malowania kresek przesta�
> byďż˝ tak istotny.
>
> | Bartek dosta� pul�, wi�c wie jakie tam s� znaki i jak je kodowa�.
> | By� mo�e mo�na kodowa� numery z puli Zbiorem B, ale czy
> | na pewno, tego nie wiem. Czytnik powinien odczyta� i Zbi�r B.
> |
> | Innymi s�awami m�wi�c dla Zestawu C jeden znak kodu okre�la dwie cyfry.
> | Kod jest w tym konkretnym przypadku dwukrotnie zmniejszony
> | w/g http://wipos.p.lodz.pl/zylla/ut/barcode/ean128.php zapis jest
> | nast�puj�cy
> |
> | StartC Fnc1 00 15 90 07 73 30 00 00 00 05 11 Stop
> |
> | w sumie jest 10 znak�w danych + 3 znaki specjalne + 1 znak kontrolny
> |
> | R�nice w d�ugo�ci kodu jest pokazana na:
> | http://www.bratki.w.v1.pl/tmp/Code128C.png
>
> Dla Code128 okre�la si� g�rn� granic� jako 16cm szeroko�ci i/lub 48 znak�w
> (vide przytoczona przez Ciebie specyfikacja).
> Jak d�ugo pierwszy i drugi spos�b kodowania nie przekrocza tej granicy,
> dyskusja jest pewnie czysto akademicka.
No nie bardzo. Mo�e doj�� do ograniczenia wielko�ci miejsca na kod paskowy.
By� mo�e na druku miejsce na ADRES POMOCNICZY jest zbyt w�skie
by pomie�ci� ci�g znak�w kodowany Zbiorem B, a zupe�nie spokojnie wchodzi
tam ci�g znak�w kodowany Zbiorem C.
[...]
> Ale ta "akademicko��" te� jest ciekawa :)
> Ko�cem nosa czuj�, �e optymalizacja sposobu kodowania (z u�yciem
> prze��cznik�w) mo�e zahacza� o problem komiwoja�era, czyli w najlepszym
> wypadku o algorytmy szacunkowe, bez pretensji do �cis�o�ci matematycznej.
> Nadal jest to fajne wyzwanie.
>
> Jeszcze inna ciekawostka, to sprawa umieszczania w jednym kodzie kilku
> informacji.
> Czyli (zn�w za specyfikacj�) np. kodu produktu, jego wagi czy ceny.
> Wykorzysta� predefiniowane "d�ugo�ci" czy u�y� FNC1 jako rozdzielnika.
>
O nie, w ��czenie kod�w nie chce mi si� wchodzi�.
U�ywaj�c znaku FNC1 jako rozdzielacza, nale�y pami�ta� �e czasami
znak kontrolny mo�e by� znakiem FNC1, ale i tak rozpatrujemy
wszystkie znaki opr�cz dw�ch ostatnich (Kontrolny i Stop).
No chyba �e zrobimy Split w/m znaku FNC1 dla ca�ego odczytanego ci�gu,
to mo�emy si� zdziwi�.
[...]
> No i na koniec:
> Czy znak Start + FNC1 (jako rozszerzony znak Start) wchodzi jako element
> wyliczanej sumy kontrolnej czy nie?
> Bo jako� nie znalaz�em tej informacji w specyfikacji.
Na stronie 5 jest przyk�adzik.
Znak kontrolny symbolu "Kod 128" powinien byďż˝ obliczony zgodnie
nast�puj�cymi zasadami:
<cyt>
a) Ka�dy znak symbolu ma nadan� warto�� (patrz: Tabela 1).
b) Ka�da pozycja znaku symbolu ma nadany wsp�czynnik wa�ony. Znak Start ma
wsp�czynnik wa�ony "1". Nast�pnie, zaczynaj�c od lewej strony od pierwszego
znaku
wyst�puj�cego po znaku Start, wsp�czynniki wa�one przybieraj� warto��
1, 2, 3, 4 .... n, dla wszystkich kolejnych znak�w symbolu a_ do, lecz go
nie
w��czaj�c, znaku kontrolnego symbolu; n oznacza liczb� znak�w w
symbolu reprezentuj�cych dane lub specjaln� informacj� w symbolu, wy��czaj�c
znaki Start/Stop i znak kontrolny.
Nale�y tu zaznaczy�, �e zar�wno znak Start, jak i nast�puj�cy po nim
pierwszy
znak symbolu maj� wsp�czynnik wa�ony "1".
</cyt>'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
czyli dla 2009, mamy:
Start C = 1x105=105
FNC1 = 1x102 =102
20 =2x20=40
09 =3x9=27
....
znak kontrolny =274-2*103=68
>
> Pomijaj�c wszystko co powy�sze, zapominaj�c o ewentualnych niuansach przy
> wyliczaniu sumy kontrolnej, wydaje si�, �e spreparowany przeze mnie spos�b
> malowania kodu jest do�� uniwersalny.
>
> To, czego ewidentnie mu brakuje, to w zasadzie jedna funkcja
> optymalizuj�ca wej�ciowy string.
[...]
> ale gdy tak juz to zostanie zrobione (przez u�ytkownika lub algorytmem) i
> przekazane dalej, to moje modu�y powinny to �adnie wyrysowa�/wymalowa�.
>
> Wracaj�c do rozdzielczo�ci...
> swego czasu pow�tpiewa�e� czy moje jednopikselowe kody kreskowe z
> w��czonym trybem rozszerzania obrazka przypadkiem czego� nie przek�ami�.
> Na ekranie mo�e tak, mo�e nie. Ale z ekranu �aden czytnik niczego zczyta�
> nie potrafi ;)
> Za� na wydruku jako� zawsze si� to �wietnie spisywa�o.
<cyt>
str 9 ...
5) Jego budowa jest modularna (w tabeli 1 przedstawiony jest wz�r
element�w
ka�dego znaku Kodu 128).
Minimalny wymiar modu�u X wynosi 0,191 mm.
</cyt>
Je�eli mamy (chyba typowo) rozdzielczo�� DPI=96 to
szeroko�� piksela: 25,4 / 96= 0,26 mm
Rysuj�c na ekranie mamy 0,07 mm straty na ka�dym module
Dla rozdzielczo�ci 300 DPI
szeroko�� piksela: 25,4 / 300= 0,085 mm, czyli musimy rysowa�
moduďż˝ za pomocďż˝ 3 pikseli 3* 0,085=0,254
Czyli na to samo wychodzi.
No chyba, �e co� pokr�ci�em
Mo�emy (w kontek�cie 300DPI) narysowa� modu� (czyli najw�szy pasek)
o szeroko�ci 1 piksela, ale czy tak w�ski pasek przeczyta czytnik ???
R�nice w d�ugo�ci kodu przedstawia�em ju� na
http://www.bratki.w.v1.pl/tmp/Code128C.png
zaznaczaj�c, �e widz� drobn� r�nice w jednym pasku pionowym
w por�wnaniu z kodem utworzonym przez generator i mam nadziej�,
�e czytnik da sobie rad�.
Ot� NIE. Czytnik odm�wi� wsp�pracy przy tym kodzie. Nie czyta� go.
O��wkiem pogrubi�em problematyczn� lini� i czytnik odczyta� kod.
Czy to by� b��d programu. Ot� i tak i nie.
Formant Image miaďż˝ ustawione border Width=1pt i Size Mode =Stretch
(dla potrzeb przedstawienia na WWW), a wymiary formantu programowo
dopasowywany by� do zawarto�ci. Czyli obramowanie zabra�o cz��
miejsca na bitmapďż˝
Nast�pi�a zmiana szeroko�ci bitmapy o 1 lub kilka pikseli.
I co zrobiďż˝ Access. Ano dopasowaďż˝ bitmapďż˝.
Szeroko�� jednego z pask�w zmniejszy� o 1 piksel i by� mo�e
bia�e obramowanie o pozosta�y(e) piksel(e).
No i b��d odczytu gotowy.
By� to zupe�ny przypadek, ale bardzo dobrze ze si� zdarzy�.
Przyk�ad obrazuj�cy problem skalowania:
http://www.bratki.w.v1.pl/tmp/Code128CTest.png
Trzy pierwsze kody (od g�ry) s� prawid�owe.
W dw�ch dolnych pasek zaznaczony na czerwono powoduje
b��d odczytu !
--
Pozdrowienia
BraZby
www.bratki.w.v1.pl/accesspseudofaq
|| W specyfikacji, do kt�rej poda�e� link�, wyra�nie m�wi�, �e to w
|| zasadzie program powinien sam optymalizowaďż˝ czy w Code128 zostanie
|| u�yty typ A, B, czy C.
|| Nawet podaj� og�lne wytyczne czym taki algorytm mia�by si� kierowa�.
|| Powiem szczerze, �e bardzo mnie to zainteresowa�o.
|
| [...]
|
| Moim zdaniem Zestaw A jest zupe�nie spokojnie do odrzucenia,
| chyba �e chcemy przekazywa� znaki steruj�ce. Ju� bardziej ciekawe jest
| u�ycie Znaku FNC4 rozszerzaj�cego zakres o nast�pne 128.
| Ale czy czytniki to ju� obs�uguj�, tego nie wiem.
No w�a�nie... Cos mi tam przeb�ys�o, �e w zasadzie toto nie dzia�a...
Czy raczej: dzia�a, ale jedynie w obr�bie hameryka�skiej strony kodowej
(?)
Mniejsza... Jakos mi na razie nie zale�y na � i � ;)
| Nie bardzo chce mi siďż˝ bawiďż˝ w takie optymalizowanie.
szkoda ;)
| a mo�e wymusi�, a raczej je�eli jest to mo�liwe samemu to zrobi�, by
| przed ostatnim nieparzystym znakiem dopisaďż˝ 0
| 12345 -->123405
| StartC 12 34 05 - 4 znak�w
| Oczywi�cie s� pu�apki dla ostatniego, tak zapisanego znaku,
No w�a�nie. Nie m�w mi, ze nie widzisz r�nicy mi�dzy ci�giem
12345
a
123405
bo dla mnie to zupe�nie inny kod.
Co? doda� kolejny znak sugeruj�cy obsuwk� zera? :)
To juďż˝ bardziej
12345
versus
012345
ale odrzucam i jedno i drugie. Nie o taka optymalizacjďż˝ chodzi.
|| Pami�tamy oczywi�cie ca�y czas, �e w tym kodzie w ka�dej chwili mo�emy
|| prze��czy� si� mi�dzy typami lub po prostu u�y� SHIFT (dla pojedynczego
|| znaku).
|
| No, nie bardzo, jedynie w obr�bie Zbior�w A i B:
|
| <cyt>
| a.. Znak Shift zmienia zestaw kodu A na B lub B na A dla jednego znaku
| nast�puj�cego po znaku Shift. Znak nast�puj�cy po znaku, na kt�ry
| zadzia�a� znak Shift wraca do zestawu kodu A lub B zdefiniowanego przed
| znakiem Shift. </cyt>
|
| W zestawie C nie ma znaku SHIFT.
Oj, ale jesteďż˝ drobiazgowy :)
Jasne, �e w C nie ma SHIFT, bo co tu shiftowa� ;)
|| Dla Code128 okre�la si� g�rn� granic� jako 16cm szeroko�ci i/lub 48
|| znak�w (vide przytoczona przez Ciebie specyfikacja).
|| Jak d�ugo pierwszy i drugi spos�b kodowania nie przekrocza tej granicy,
|| dyskusja jest pewnie czysto akademicka.
|
| No nie bardzo. Mo�e doj�� do ograniczenia wielko�ci miejsca na kod
| paskowy. By� mo�e na druku miejsce na ADRES POMOCNICZY jest zbyt w�skie
| by pomie�ci� ci�g znak�w kodowany Zbiorem B, a zupe�nie spokojnie
| wchodzi tam ci�g znak�w kodowany Zbiorem C.
Ok, Ok! Masz racjďż˝. Sďż˝ jeszcze wymogi Poczty Polskiej. :)))
Ale m�wi�em tylko o specyfikacji.
| [...]
| O nie, w ��czenie kod�w nie chce mi si� wchodzi�.
No wiem, �atwiej zwali� to na juzeri� :)
Ale dlaczego nie chce Ci siďż˝ wchodziďż˝?
W sumie rozgraniczmy: piszemy program do drukowania kodu kreskowego czy
program do interpretowania co odczytaďż˝ czytnik?
Bo je�li tylko to pierwsze, to chyba nie trzeba a� tak si� stara�? Czy na
odwr�t? ;)
|| No i na koniec:
|| Czy znak Start + FNC1 (jako rozszerzony znak Start) wchodzi jako
|| element wyliczanej sumy kontrolnej czy nie?
|| Bo jako� nie znalaz�em tej informacji w specyfikacji.
|
| Na stronie 5 jest przyk�adzik.
| (...)
No i d*pa, bo przyk�adzik dotyczy Code128 a nie rozszerzonego GS1-128.
Dla mnie nie jest to jednoznaczne.
| [...]
| Formant Image miaďż˝ ustawione border Width=1pt i Size Mode =Stretch
| (dla potrzeb przedstawienia na WWW), a wymiary formantu programowo
| dopasowywany by� do zawarto�ci. Czyli obramowanie zabra�o cz��
| miejsca na bitmapďż˝
|
| Nast�pi�a zmiana szeroko�ci bitmapy o 1 lub kilka pikseli.
| I co zrobiďż˝ Access. Ano dopasowaďż˝ bitmapďż˝.
| Szeroko�� jednego z pask�w zmniejszy� o 1 piksel i by� mo�e
| bia�e obramowanie o pozosta�y(e) piksel(e).
|
| No i b��d odczytu gotowy.
| By� to zupe�ny przypadek, ale bardzo dobrze ze si� zdarzy�.
Kurde, nie rozumiem. Oczywi�cie mo�emy wszystko zrzuci� na Border i ju�...
Ale czy na access'a ? Bo je�li dobrze rozumiem, Mode=Stretch
przeskalowa�oby wszystkie paski a nie jaki� ostatni (?)
Dlaczego ostatni? Mo�e nast�pi�o jakie� uci�cie i ju�?
--
KN
>[...]
>
> Rozumiem, �e mozna do nich wyst�pi� o "pul� numer�w" i wtedy drukujemy
> sami?
> Dbaj�c jedynie o unikalno�� ka�dego numeru?
Aha.
Kie�pi�
__________ Informacja programu ESET NOD32 Antivirus, wersja bazy sygnatur wirus�w 4058 (20090507) __________
>
>
> | a mo�e wymusi�, a raczej je�eli jest to mo�liwe samemu to zrobi�, by
> | przed ostatnim nieparzystym znakiem dopisaďż˝ 0
> | 12345 -->123405
> | StartC 12 34 05 - 4 znak�w
> | Oczywi�cie s� pu�apki dla ostatniego, tak zapisanego znaku,
>
> No w�a�nie. Nie m�w mi, ze nie widzisz r�nicy mi�dzy ci�giem
> 12345
> a
> 123405
>
> bo dla mnie to zupe�nie inny kod.
> Co? doda� kolejny znak sugeruj�cy obsuwk� zera? :)
>
> To juďż˝ bardziej
> 12345
> versus
> 012345
>
> ale odrzucam i jedno i drugie. Nie o taka optymalizacjďż˝ chodzi.
Ja zaproponowa�em to raczej z mojego "specyficznego" punktu widzenia.
Oczywi�cie, je�eli chodzi o przekazania ci�gu jako liczby (czy te� liczby
jako ci�g znak�w) to moja sugestia jest bez sensu.
Ja bardziej zainteresowany jestem utworzeniem w�asnego systemu
oznacze� pewnych grup element�w:
grupa g��wna: 0 do 99 -> formatowane na 00
podgrupa: 0 do 99 -> formatowane na 00
i subgrupa: 0 do 999 -> formatowane na 000 ???
a dalej np. numeryczne (lub alfanumeryczny) identyfikator.
Zamiast babraďż˝ siďż˝ w kodowanie ostatniego, (tego nie od pary) znaku
nale�y sformatowa� subgrup� na 0000. Mam parzyst� liczb� znak�w
i oszcz�dzam jeden znak prze��czenia na zbi�r A.
Ale je�eli kodowana jest liczba, no to nie ma tak prostej zabawy.
[...]
>
> || No i na koniec:
> || Czy znak Start + FNC1 (jako rozszerzony znak Start) wchodzi jako
> || element wyliczanej sumy kontrolnej czy nie?
> || Bo jako� nie znalaz�em tej informacji w specyfikacji.
> |
> | Na stronie 5 jest przyk�adzik.
> | (...)
>
> No i d*pa, bo przyk�adzik dotyczy Code128 a nie rozszerzonego GS1-128.
> Dla mnie nie jest to jednoznaczne.
Zobacz na str. 30
http://tinyurl.com/cq8tb9
>
> | [...]
> | Formant Image miaďż˝ ustawione border Width=1pt i Size Mode =Stretch
> | (dla potrzeb przedstawienia na WWW), a wymiary formantu programowo
> | dopasowywany by� do zawarto�ci. Czyli obramowanie zabra�o cz��
> | miejsca na bitmapďż˝
> |
> | Nast�pi�a zmiana szeroko�ci bitmapy o 1 lub kilka pikseli.
> | I co zrobiďż˝ Access. Ano dopasowaďż˝ bitmapďż˝.
> | Szeroko�� jednego z pask�w zmniejszy� o 1 piksel i by� mo�e
> | bia�e obramowanie o pozosta�y(e) piksel(e).
> |
> | No i b��d odczytu gotowy.
> | By� to zupe�ny przypadek, ale bardzo dobrze ze si� zdarzy�.
>
> Kurde, nie rozumiem. Oczywi�cie mo�emy wszystko zrzuci� na Border i ju�...
> Ale czy na access'a ? Bo je�li dobrze rozumiem, Mode=Stretch
> przeskalowa�oby wszystkie paski a nie jaki� ostatni (?)
> Dlaczego ostatni? Mo�e nast�pi�o jakie� uci�cie i ju�?
Na Border nic nie zrzucam. Border razem z Clip jest OK,
ale Border rysowane jest tak�e wewn�trz formantu Image.
I tutaj zaczyna byďż˝ problem.
Rozpatrzmy przyk�adow� bitmap� i formant Image:
Szeroko�� formantu= 2460 twip�w, czyli 46,57 mm przy DPI 96
Border=0; SizeMode = Stretch -> co w moim przypadku nie gra roli
poniewa� formant Image programowo jest dopasowany do wymiar�w bitmapy,
przez co dla r�nych kod�w, szeroko�� formantu Image jest r�na
No to rysujemy przyk�adowy kod kreskowy, czyli nasz "Orygina�".
Czyta go prawid�owo czytnik.
Ale co siďż˝ stanie gdy akurat nie dopasowujemy rozmiaru formantu Image
do rozmiaru bitmapy, ale mamy SizeMode = Stretch by dopasowaďż˝
bitmap� do rozmiar�w formantu.
No to ustawmy szeroko�� formantu image na 46,04 mm, czyli 2410 twip�w.
Praktycznie zmniejszyli�my szeroko�� bitmapy o 0, 53 mm, czyli 2 piksele
ekranowe, w naszym przyk�adzie ze 176 pikseli na 174 piksele.
Jak Access zgubiďż˝ 2 piksele.
A. 1-szy piksel:
Popatrzmy na 10 i 11 czarny pionowy pasek kodu oryginalnego (licz�c
od lewej). jest tam uk�ad : X_XXX (czarny pasek 1px, bia�y pasek 1px,
czarny pasek 3px)
Obszar ten Access zamieniďż˝ na XXXX , czyli utworzyďż˝ jeden czarny pasek
o szeroko�ci 4 px, usuwaj�c bia�y 1 pikselowy pasek.
Praktycznie zosta� usuni�ty bia�y i czarny pasek.
B. 2-gi piksel
Bia�y pasek o szeroko�ci 3 px, pomi�dzy 9 a 10 paskiem czarnym (licz�c
od strony prawej) zmniejszyďż˝ o 1 px. I to wszystko.
Czym si� Access kierowa� przy wyborze tych pask�w wiedz� chyba tylko
programi�ci M$.
A m�g� przecie� uci�� (a raczej zlikwidowa�) bia�y obszar po lewej lub po
prawej stronie. Bo to du�y jednolity obszar. Prawda ?
Ale jest to tzw. cicha strefa o �ci�le okre�lonej szeroko�ci.
No, a jak by�my narysowali kod paskowy bez margines�w (tzw. cichej strefy).
To gdzie ma usun�� te dwa piksele.
Efekt pomniejszenia bitmapy powoduje tak�e ustawienie obramowania formantu
Image. Je�li si� nie myl� to obramowanie rysowane jest po po�owie (jakie by
te po�owy nie by�y dla jednego piksela) wewn�trz i na zewn�trz obrysu
formantu, zajmuj�c tym samym obszar przeznaczony na bitmap�.
Moim zdanie najlepszy jest SizeMode=Clip.
Wtedy nic Ci Access nie Utnie.
Wydaje mi si�, �e im wi�ksza rozdzielczo��, tym mniejszy problem.
Ale im bardziej upakowany (g�ciejszy) kod tym bardziej wra�liwy na
skalowanie.
Ja rozpatrywa�em wszystko w kontek�cie Ekranu, u mnie DPI =96.
<dywagowanie>
Mo�na si� bawi� w rysowanie na wi�kszej bitmapie (czyli w wi�kszej
rozdzielczo�ci), ale potem to trzeba wsadzi� w formant Image.
Nasuwa sie pytanie jak Access drukuje wi�ksze bitmapy.
Czy na drukarkďż˝ idzie tylko przeskalowana bitmapa z formantu Image,
czy przekazywana jest ca�a bitmapa, kt�ra w trakcie wydruku jest
skalowana do konkretnej rozdzielczo�ci drukarki ?
Mo�na r�wnie� bawi� si� w rysowanie w kontek�cie hdc Printera i wysy�a�
bitmap� na drukark�, ale to tylko rozwa�ania dotycz�ce raczej drukowania
samych etykietek z kodem.
</dywagowanie>
--
Pozdrowienia
BraZby
[...]
Zapomnia�em poda� link do przyk�adowego obrazka:
http://www.bratki.w.v1.pl/tmp/Code128C_Test2a.png
--
Pozdrowienia
BraZby
|||| No i na koniec:
|||| Czy znak Start + FNC1 (jako rozszerzony znak Start) wchodzi jako
|||| element wyliczanej sumy kontrolnej czy nie?
|||| Bo jako� nie znalaz�em tej informacji w specyfikacji.
|| No i d*pa, bo przyk�adzik dotyczy Code128 a nie rozszerzonego GS1-128.
|| Dla mnie nie jest to jednoznaczne.
|
| Zobacz na str. 30
| http://tinyurl.com/cq8tb9
Teraz juďż˝ wszystko ok!
Czyli po prostu dla cel�w obliczenia sumy kontrolnej pierwszy FNC1
traktowany jest jak ka�dy inny znak w Code128.
Oznacza to te�, �e w samym algorytmie nic si� nie zmienia. I to jest dobra
nowina :)
Je�li w mojej bazie zapragn� przekaza� co� w kodzie GS1-128, to wystarczy
jesli do "AlaMaKota01234567" doklej� na pocz�tku owo FNC1.
Czyli
Chr(135) & "AlaMaKota01234567"
i wybiorďż˝ Start B.
Oczywi�cie je�li zrzuc� wszystko na uzytkownika, to niech po literach
wstawi sobie CodeC, a pary cyfr przekszta�ci do odpowiednich znak�w.
By�oby to wtedy:
Chr(135) & "AlaMaKota" & chr(131) & chr(33) & chr(55) & chr(77) &
chr(99)
------------------------------------------------------------------------
FNC1 AlaMaKota CodeC 01 23 45 67
Zamiast 8 znak�w przeka�e 5. Zysk: 3 znaki.
Niemniej ju� widz�, �e w swoim module w og�le nie uwzgl�dni�em przypadku
StartC/CodeC.
Albo bezwiednie za�o�y�em, �e u�ytkownik przeka�e pary cyfr ju�
przekonwertowane do znak�w...
Czyli jest co poprawiaďż˝.
Swojďż˝ drogďż˝ ciekawe sďż˝ te znaki funkcyjne w CodeA...
Jakie mogďż˝ one mieďż˝ praktyczne znaczenie?
Czy je�li przeka�� c128a_HT (73 := chr(105)), to czytnik jako emulator
klawiatury przeka�e to jako Tab (chr(9)) ?
Czy b�dzie to oznacza� przeskok do kolejnej kontrolki???
(kurde, nie mam obecnie czytnika by to sprawdziďż˝...)
Z kolei, jesli w aplikacji chcia�bym sw�j kod roz�o�y� do kilku kontrolek
(vide: nr, waga, jednostka), to juďż˝ chyba lepiej wykorzystaďż˝ grupowanie,
hmmm...
Coraz bardziej zaciekawia mnie ten Code128...
||| [...]
| Rozpatrzmy przyk�adow� bitmap� i formant Image:
|
| Szeroko�� formantu= 2460 twip�w, czyli 46,57 mm przy DPI 96
|
| Border=0; SizeMode = Stretch -> co w moim przypadku nie gra roli
| poniewa� formant Image programowo jest dopasowany do wymiar�w bitmapy,
| przez co dla r�nych kod�w, szeroko�� formantu Image jest r�na
|
| No to rysujemy przyk�adowy kod kreskowy, czyli nasz "Orygina�".
| Czyta go prawid�owo czytnik.
|
| Ale co siďż˝ stanie gdy akurat nie dopasowujemy rozmiaru formantu Image
| do rozmiaru bitmapy, ale mamy SizeMode = Stretch by dopasowaďż˝
| bitmap� do rozmiar�w formantu.
| No to ustawmy szeroko�� formantu image na 46,04 mm, czyli 2410 twip�w.
| Praktycznie zmniejszyli�my szeroko�� bitmapy o 0, 53 mm, czyli 2
| piksele ekranowe, w naszym przyk�adzie ze 176 pikseli na 174 piksele.
|
| Jak Access zgubiďż˝ 2 piksele.
(...)
| Moim zdanie najlepszy jest SizeMode=Clip.
| Wtedy nic Ci Access nie Utnie.
Ech, no tak, ale obydwaj chyba podchodzimy do tego z dw�ch skrajnych
punkt�w...
Jakie by�o moje rozumowanie:
Narysowaďż˝ najmniejszďż˝ mozliwďż˝ bitmapďż˝, bo...
Czyli niech b�dzie monochromatyczna (niewielki narzut nag��wka ale
oszcz�dno�� na pixelach na bajt) oraz wysoko�ci jednego pixela.
W poziomie jeden pixel (jako jednostka minimalna) musi reprezentowaďż˝
szeroko�� najw�szego modu�u (o ile pozosta�e s� jego wielokrotno�ci�).
Dzi�ki takiemu zabiegowi mam naprawd� bardzo ma�� bitmapk�, jej
"rysowanie" jest szybkie itd. itp.
Uzytkownik sam okre�la wielko�� kodu kreskowego (wielko�� kontrolki Obraz)
a ja wsadzam bitmap� i j� rozci�gam.
Rozci�gam! Nie zaw�am! (przynajmniej w 99% przypadkach :) )
Fakt, �e nie wprowadzi�em �adnej kontroli, czy pierwotna bitmapa nie jest
zbyt g�sta lub cos przek�amuje.
Przyjmijmy za�o�enie, �e u�ytkownik:
a) zna ograniczenia Code128 (np: 48 znak�w i max. 16cm)
b) sprwadza czy czytnik prawid�owo odczytuje kod kreskowy
Jakie jest ryzyko, �e rozci�gni�ty pixel zostanie przek�amany?
�e zostanie zinterpretowany nie jako jeden minimalny modu� tylko 2?
Na ekranie mo�e wygl�da� to r�nie, ale na papierze (ponad 3 krotnie
wi�ksza rozdzielczo��) jest ju� du�o lepiej i jakims cudem mie�ci si� w
tolerancji samego kodu.
Czy przy rozci�ganiu jest ryzyko, �e zniknie bia�a przerwa mi�dzy czarnymi
modu�ami? E, chyba nik�a.
Niby jest ryzyko, �e je�li rozci�gn� 1 pixel 10.5-krotnie, to czasami
b�dzie to 10 pikseli a czasem 11.
Ale modu� 2x szerszy b�dzie mia� szeroko�� 20, 21 lub 22 piksele.
I to si� chyba najwyra�niej �wietnie mie�ci w tolerancji wbudowanej w sam
czytnik.
| <dywagowanie>
|
| Mo�na si� bawi� w rysowanie na wi�kszej bitmapie (czyli w wi�kszej
| rozdzielczo�ci), ale potem to trzeba wsadzi� w formant Image.
|
| Nasuwa sie pytanie jak Access drukuje wi�ksze bitmapy.
| Czy na drukarkďż˝ idzie tylko przeskalowana bitmapa z formantu Image,
| czy przekazywana jest ca�a bitmapa, kt�ra w trakcie wydruku jest
| skalowana do konkretnej rozdzielczo�ci drukarki ?
|
| Mo�na r�wnie� bawi� si� w rysowanie w kontek�cie hdc Printera i wysy�a�
| bitmap� na drukark�, ale to tylko rozwa�ania dotycz�ce raczej drukowania
| samych etykietek z kodem.
|
| </dywagowanie>
BraZby, ja osobi�cie podziwiam Twoj� zdolno�� operowania na bitmapach i
tutaj nic od lat siďż˝ nie zmienia.
Rozumiem np. Twoj� ambicj� aby stworzy� bitmap�, kt�ra zawiera nie tylko
kreski ale tak�e humanreadable information.
I to, cho� fajne, narzuca Ci konieczno�� rysowania bitmapy w rzeczywistym
rozmiarze.
Pewnie masz zupe�n� racj�, �e w ko�cu generowanie bitmapy kt�ra wa�y 10kB
a bitmapy 100B, to i tak pomijalna r�nica czasowa i RAM'u.
Ale w�a�nie teraz zauwa�am, �e chyba moje podej�cie minimalistyczne jest
bezpieczniejsze.
Bo chyba bitmapa nie cierpi �cie�niania. Tu dochodzi do najcz�stszych
przek�ama�. Nawet w tak niewinnym przypadku jak styl obramowania.
Za to w przypadku rozci�gania jest chyba lepiej.
Powiem tak.
Drukowa�em unikalny kod EAN13 w dziesi�tkach ty�. egzemplarzy na kartkach
A4 (ka�da kartka inne 5 kod�w).
Nast�pnie te kartki do nas wraca�y i by�y wrzucane do skanera.
Inny m�j program te skany dekodowa� przy pomocy jakiego� ActiveX, ju� nie
pami�tam jakiego.
Ilo�� nierozpoznanych kartek by�a minimalna! Gdzie� poni�ej 1%% !
Mimo dodatkowych b��d�w jakie narzuca�a operacja skanowania!
(przekr�cony dokument w podajniku, zagi�ta kartka, kilka kartek
wci�gni�tych naraz ...)
Skaner byďż˝ z podajnikiem i niesamowicie wydajny (kosztem pewnie
dok�adno�ci) a wszystkie rozpoznane pliki by�y pod now� nazw� przesuwane
do innego katalogu, wraz z notacjďż˝ w bazie.
Powiesz: EAN13 to jednak zupe�nie co innego ni� Code128. Ma sta��
szeroko�� (13 cyfr i ani jednej mniej czy wi�cej). Jest bardzo ostry.
Obrazek szeroko�ci 5-6cm to czasami a� zbyt kulfoniasty kod wychodzi� :)
Niemniej... Sam by�em zaskoczony. Przypuszczam, �e w supermarketach
cz�ciej musz� wpisywa� kod z palca.
No i w ko�cu, wydaje si�, �e w zastosowaniach przemys�owych Code128 te� ma
przewidywaln� szeroko��.
Je�li PocztaPolska rezerwuje dla niego 7cm, to rozumiem, �e nie oczekuje
aby tam by�o wi�cej ni� po�owa z dopuszczalnych 45-u znak�w.
No i na koniec mo�emy powr�ci� do tematu EMF, kt�ry - jak pami�tam -
roztrzaska�e� �wietnie.
Czyli nie piszemy pikseli tylko instrukcje. Namaluj czarny prostok�t,
potem kolejny itd.
Czy to jednak przeskoczy problem ziarnisto�ci obrazka? Je�li EMF-a b�dzie
trzeba zaw�zi� tak, �e jeden pixel (w zadanym kontek�cie) ma przyj�� 0,7
piksela, to chyba i EMF nie poradzi.
[...]
> Swojďż˝ drogďż˝ ciekawe sďż˝ te znaki funkcyjne w CodeA...
> Jakie mogďż˝ one mieďż˝ praktyczne znaczenie?
> Czy je�li przeka�� c128a_HT (73 := chr(105)), to czytnik jako emulator
> klawiatury przeka�e to jako Tab (chr(9)) ?
> Czy b�dzie to oznacza� przeskok do kolejnej kontrolki???
>
> (kurde, nie mam obecnie czytnika by to sprawdziďż˝...)
>
No nie m�w ze chcesz sterowa� Accessem za pomoc� czytnika kod�w.
By czytaďż˝ kod przeskakiwaďż˝ po kontrolkach, wpisywaďż˝ tekst,
dodawaďż˝ nowe linie.
No nie wiem jak zareaguje Access na sygna�y z czytnika
robi�cego za klawiatur�..
> Z kolei, jesli w aplikacji chcia�bym sw�j kod roz�o�y� do kilku kontrolek
> (vide: nr, waga, jednostka), to juďż˝ chyba lepiej wykorzystaďż˝ grupowanie,
> hmmm...
No niby mo�esz ��czy� kody w grupy, b�d� stosuj�c IZ okre�laj�cy
d�ugo�� danych, b�d� znak FNC1. Oszcz�dzasz praktycznie
tylko na znaku kontrolnym.
>
> Coraz bardziej zaciekawia mnie ten Code128...
>
[...]
> | Jak Access zgubiďż˝ 2 piksele.
> (...)
> | Moim zdanie najlepszy jest SizeMode=Clip.
> | Wtedy nic Ci Access nie Utnie.
>
> Ech, no tak, ale obydwaj chyba podchodzimy do tego z dw�ch skrajnych
> punkt�w...
>
> Jakie by�o moje rozumowanie:
> Narysowaďż˝ najmniejszďż˝ mozliwďż˝ bitmapďż˝, bo...
>
> Czyli niech b�dzie monochromatyczna (niewielki narzut nag��wka ale
> oszcz�dno�� na pixelach na bajt) oraz wysoko�ci jednego pixela.
> W poziomie jeden pixel (jako jednostka minimalna) musi reprezentowaďż˝
> szeroko�� najw�szego modu�u (o ile pozosta�e s� jego wielokrotno�ci�).
>
> Dzi�ki takiemu zabiegowi mam naprawd� bardzo ma�� bitmapk�, jej
> "rysowanie" jest szybkie itd. itp.
Dla 10 znak�w kodowanych w poziomie rzeczywi�cie jest malutko
bo ok. 65 bajt�w,
ale dla paska w orientacji pionowej masz ju� ok. 700 bajt�w
___
Poni�ej przedstawiam procedur� rysuj�ca bitmap� o wys. 1 pix.
kt�r� mo�na sobie rozci�gn��.
Przyk�adowe wywo�anie:
Dim sCodeData As String
' sCodeData - przekazane szeroko�ci poszczeg�lnych pask�w
sCodeData = "211232411131212222113222" & _
"214121122312142112212123" & _
"212222212222212222131222" & _
"2312122331112"
StretchBarCode Me.imgTest, sCodeData
W poziomie zajmuje 11 * 10 * 3 + 2 * 3 + 40 = 376 bajt�w
W pionie (korzystam z w�asnej funkcji obracaj�cej)
11 * 10 * 4 + 2 * 4 + 40 = 488 bajt�w
'_______________________________
Private Sub StretchBarCode( _
img As Access.Image, _
sCodeData As String)
Dim lBmpWidth As Long
Dim lLenLine As Long
Dim fBlack As Boolean
Dim aPixInBar() As Byte
Dim aPict() As Byte
Dim lOffset As Long
Dim i As Long, j As Long
' ilo�� wszystkich element�w * 11 modu��w na znak
' + 2 dodatkowe modu�y w znaku Stop
lBmpWidth = (Len(sCodeData) \ 6) * 11 + 2
' d�ugo�� linii w bajtach (wielokrotno�� 4)
lLenLine = ((lBmpWidth * 3 + 3) \ 4) * 4
ReDim aPict(0 To 39 + lLenLine) As Byte
' wype�nij BitmapInfoHeader podstawowymi danymi
aPict(0) = 40: aPict(8) = 1
aPict(12) = 1: aPict(14) = 24:
CopyMemory aPict(4), lBmpWidth, ByVal 4
CopyMemory aPict(20), (lLenLine), ByVal 4
aPixInBar = StrConv(sCodeData, vbFromUnicode)
lOffset = 40
For i = LBound(aPixInBar) To UBound(aPixInBar)
fBlack = Not fBlack
For j = 1 To aPixInBar(i) - 48
' czarny pasek
If fBlack Then
aPict(lOffset + 0) = 0
aPict(lOffset + 1) = 0
aPict(lOffset + 2) = 0
Else
aPict(lOffset + 0) = 255 'Blue
aPict(lOffset + 1) = 255 'Green
aPict(lOffset + 2) = 255 'Red
End If
lOffset = lOffset + 3
Next
Next
img.SizeMode = acOLESizeStretch
' tutaj ewentualnie funkcja obracaj�ca bitmap�
img.PictureData = aPict()
End Sub
[...]
>
>
> BraZby, ja osobi�cie podziwiam Twoj� zdolno�� operowania na bitmapach i
> tutaj nic od lat siďż˝ nie zmienia.
> Rozumiem np. Twoj� ambicj� aby stworzy� bitmap�, kt�ra zawiera nie tylko
> kreski ale tak�e humanreadable information.
> I to, cho� fajne, narzuca Ci konieczno�� rysowania bitmapy w rzeczywistym
> rozmiarze.
> Pewnie masz zupe�n� racj�, �e w ko�cu generowanie bitmapy kt�ra wa�y 10kB
> a bitmapy 100B, to i tak pomijalna r�nica czasowa i RAM'u.
>
Ale tak naprawd� sam proces rysowania wygl�da prawdopodobne tak:
Rysujesz bitmapk� o wysoko�ci 1 px, przekazujesz j� do Accessa, kt�remu
nakazujesz przeskalowanie bitmapy. Czyli Access w pami�ci tworzy now�
bitmap� (w kontek�cie Ekranu) , pewnie wywo�uje funkcj� API StretchBlt
i powoduje �e mo�na t� bitmap� przemalowa� ekran.
A u mnie maluj� bitmap�, przekazuj� j� Accessowi, kt�ry tylko przycina
bitmapďż˝ i maluje na ekranie. Zapewne teďż˝ tworzy nowďż˝ bitmapďż˝, ale
nie musi jej skalowa� (wybiera� kt�re piksele i gdzie doda� lub odj��).
No i u mnie PictureDate jest wi�ksza i zajmuje troch� pami�ci.
Ale jest 1:1 wi�c tyle zajmuje co ten obszar ekranu w pami�ci Windows
Ale tak jak piszesz, to s� niezauwa�alne r�nice
> Ale w�a�nie teraz zauwa�am, �e chyba moje podej�cie minimalistyczne jest
> bezpieczniejsze.
> Bo chyba bitmapa nie cierpi �cie�niania. Tu dochodzi do najcz�stszych
> przek�ama�. Nawet w tak niewinnym przypadku jak styl obramowania.
> Za to w przypadku rozci�gania jest chyba lepiej.
Je�eli niepo��dane zjawisko zachodzi przy zmniejszaniu np. o dwa piksele
to mo�e zaj�� r�wnie� przy powi�kszaniu o dwa piksele.
A takie zdarzenie mo�e pr�dzej, czy p�niej zaj��.
Jak to Kubuďż˝ Puchatek mawiaďż˝:
Wypadek to dziwna rzecz. Nigdy go nie ma dop�ki si� nie wydarzy ! ;-)
Mi to w ka�dym b�d� razie nie daje spokoju.
[...]
--
Pozdrowienia
BraZby
[...]
Nowsza wersja procedury rysuj�cej kod paskowy Kode128.
Nie sďż˝ sprawdzane jakiekolwiek warunki.
Wszystko nale�y sprawdzi� przed wywo�aniem procedury
we w�asnym zakresie.
'____________________________________________
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (pDst As Any, _
pSrc As Any, ByVal ByteLen As Long)
Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hdc As Long, _
ByVal nIndex As Long) As Long
Private Const LOGPIXELSX As Long = 88
Private Const LOGPIXELSY As Long = 90
Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, _
ByVal hdc As Long) As Long
'______________________
Private Sub btnTest_Click()
Dim sWidthBars As String
sWidthBars = "211232411131212222113222" & _
"214121122312142112212123" & _
"212222212222212222131222" & _
"2312122331112"
StretchBarCode128 sWidthBars, Me.imgTest, 1, 2, True
End Sub
'__________________________________________________________
' pobiera:
' sWidthBars - przygotowany wcze�niej ci�g znak�w w kt�rym ka�da
' cyfra oznacza szeroko�� paska. Pierwsza cyfra odnosi si� do
' czarnego paska, dalej naprzemiennie bia�y, czarny, bia�y ...
' img - formant w kt�rym ma by� osadzona bitmapa z kodem paskowym
' bRotate - k�t obrotu:
' 1 - bez obrotu; 2 - obr�t o 90 stopni w prawo
' 3 - poziomo o 180 stopni, 4 - 270 stopni w prawo
' bSize - szeroko�� modu�u (najw�szego paska)
' fFitImg - czy dopasowa� wymiar formantu Image do wi�kszego
' wymiaru bitmapy kodu paskowego
'__________________________________________________________
Private Sub StretchBarCode128( _
sWidthBars As String, _
img As Access.Image, _
Optional bRotate As Byte = 1, _
Optional bSize As Byte = 1, _
Optional fFitImg As Boolean = False)
Dim lBmpWidth As Long
Dim lBmpHeight As Long
Dim lLenLine As Long
Dim fBlack As Boolean
Dim aPixInBar() As Byte
Dim aPict() As Byte
Dim lOffset As Long
Dim lStep As Long
Dim lStep1 As Long
Dim lStep2 As Long
Dim lHdc As Long
Dim i As Long, j As Long
If bRotate < 2 Or bRotate = 3 Then
' ilo�� wszystkich element�w * 11 modu��w na znak
' + 2 dodatkowe modu�y w znaku Stop
lBmpWidth = ((Len(sWidthBars) \ 6) * 11 + 2) * bSize
lBmpHeight = 1
Else
lBmpWidth = 1
lBmpHeight = ((Len(sWidthBars) \ 6) * 11 + 2) * bSize
End If
' d�ugo�� linii w bajtach (wielokrotno�� 4)
lLenLine = ((lBmpWidth * 3 + 3) \ 4) * 4
ReDim aPict(0 To 39 + lBmpHeight * lLenLine) As Byte
aPict(0) = 40: aPict(12) = 1: aPict(14) = 24:
CopyMemory aPict(4), lBmpWidth, ByVal 4
CopyMemory aPict(8), lBmpHeight, ByVal 4
CopyMemory aPict(20), lLenLine, ByVal 4
Select Case bRotate
Case Is < 2 '1. 0 stopni
lStep = 3
lOffset = 40
Case 2 '2. 90 stopni w prawo
lStep = -4
lOffset = UBound(aPict) - 1
Case Is = 3 '3. 180 stopni w prawo
lStep = -3
lOffset = UBound(aPict) '- 1
Case Else '4. 270 stopni w prawo
lStep = 4
lOffset = 40
End Select
lStep1 = Sgn(lStep)
lStep2 = 2 * Sgn(lStep)
aPixInBar = StrConv(sWidthBars, vbFromUnicode)
For i = LBound(aPixInBar) To UBound(aPixInBar)
fBlack = Not fBlack
For j = 1 To (aPixInBar(i) - 48) * bSize
' czarny pasek
If fBlack Then
aPict(lOffset) = 0
aPict(lOffset + lStep1) = 0
aPict(lOffset + lStep2) = 0
Else
aPict(lOffset) = 255 'Blue
aPict(lOffset + lStep1) = 255 'Green
aPict(lOffset + lStep2) = 255 'Red
End If
lOffset = lOffset + lStep
Next
Next
img.SizeMode = acOLESizeStretch
img.BorderStyle = 0
' dopasuj do bitmapy
If fFitImg = True Then
lHdc = GetDC(Me.hwnd)
' dla bitmap poziomych
If lBmpHeight = 1 Then
img.Width = lBmpWidth * CSng(1440 / _
GetDeviceCaps(lHdc, LOGPIXELSX))
Else
img.Height = lBmpHeight * CSng(1440 / _
GetDeviceCaps(lHdc, LOGPIXELSY))
End If
Call ReleaseDC(Me.hwnd, lHdc)
End If
img.PictureData = aPict()
End Sub
[...]
Mo�e si� komu� przyda.
Nie testowa�em przyk�adu gruntownie, ale nie powinno
byďż˝ chyba "baboli".
--
Pozdrowienia
BraZby
www.bratki.w.v1.pl/accesspseudofaq
> [...]
>
>
> Nowsza wersja procedury rysuj�cej kod paskowy Kode128.
> Nie sďż˝ sprawdzane jakiekolwiek warunki.
> Wszystko nale�y sprawdzi� przed wywo�aniem procedury
> we w�asnym zakresie.
[...]
> '____________________________________
> Private Sub StretchBarCode128( _
> sWidthBars As String, _
> img As Access.Image, _
> Optional bRotate As Byte = 1, _
> Optional bSize As Byte = 1, _
> Optional fFitImg As Boolean = False)
[...]
>
> Mo�e si� komu� przyda.
> Nie testowa�em przyk�adu gruntownie, ale nie powinno
> byďż˝ chyba "baboli".
[...]
Troch� jednak potestowa�em i poprawi�em ma�e Co nieco.
Przede wszystkim procedura rysuje dowolny kod paskowy
w/ zadanych szeroko�ci (zmieni�em spos�b liczenia szeroko�ci).
Dodatkowo poprawi�em rysowanie w kolorach, ale sk�adowe kolor�w
trzeba samemu wpisaďż˝ na sztywno w kodzie.
Dlatego musia�em powstawia� dodatkowe przesuni�cia do bajt�w
tablicy.
Mo�liwe jest tak�e dorysowanie marginesu lewego i (lub) prawego.
'____________________________________________
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (pDst As Any, _
pSrc As Any, ByVal ByteLen As Long)
Private Declare Function GetDeviceCaps Lib "gdi32" _
(ByVal hdc As Long, _
ByVal nIndex As Long) As Long
Private Const LOGPIXELSX As Long = 88
Private Const LOGPIXELSY As Long = 90
Private Declare Function GetDC Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" _
(ByVal hwnd As Long, _
ByVal hdc As Long) As Long
'________________________
Private Sub btnTest_Click()
Dim sWidthBars As String
sWidthBars = "211232411131212222113222" & _
"214121122312142112212123" & _
"212222212222212222131222" & _
"2312122331112"
zbDrawStretchBarCode sWidthBars, Me.imgTest, 1, 2, True, 5, 10
End Sub
'__________________________________________________________
' pobiera:
' sWidthBars - przygotowany wcze�niej ci�g znak�w w kt�rym ka�da
' cyfra oznacza szeroko�� paska. Pierwsza cyfra odnosi si� do
' czarnego paska, dalej naprzemiennie bia�y, czarny, bia�y ...
' img - formant w kt�rym ma by� osadzona bitmapa z kodem paskowym
' bRotate - k�t obrotu:
' 1 - bez obrotu; 2 - obr�t o 90 stopni w prawo
' 3 - poziomo o 180 stopni, 4 - 270 stopni w prawo
' bModuleSize - szeroko�� modu�u (najw�szego paska)
' fFitImg - czy dopasowa� wymiar formantu Image do wi�kszego
' wymiaru bitmapy kodu paskowego
' lMarginLeft - lewy margines bitmapy (w modu�ach)
' lMarginRight - prawy margines bitmapy (w modu�ach)
'__________________________________________________________
Private Sub zbDrawStretchBarCode( _
sWidthBars As String, _
img As Access.Image, _
Optional bRotate As Byte = 1, _
Optional bModuleSize As Byte = 1, _
Optional fFitImg As Boolean = False, _
Optional lMarginLeft As Long = 0, _
Optional lMarginRight As Long = 0)
Dim lBmpWidth As Long
Dim lBmpHeight As Long
Dim lLenLine As Long
Dim fBlack As Boolean
Dim aPixInBar() As Byte
Dim aPict() As Byte
Dim lOffset As Long
Dim lStep As Long
Dim lStep0 As Long
Dim lStep1 As Long
Dim lStep2 As Long
Dim lHdc As Long
Dim i As Long, j As Long
aPixInBar() = StrConv(sWidthBars, vbFromUnicode)
' oblicz szeroko�� bitmapy kodu paskowego
For i = 0 To UBound(aPixInBar)
lBmpWidth = lBmpWidth + (aPixInBar(i) - 48)
Next
' dodaj marginesy
lBmpWidth = (Abs(lMarginLeft) + lBmpWidth + _
Abs(lMarginRight)) * bModuleSize
lBmpHeight = 1
' orientacja pionowa
If bRotate = 2 Or bRotate > 3 Then
lBmpHeight = lBmpWidth
lBmpWidth = 1
End If
' d�ugo�� linii w bajtach (wielokrotno�� 4)
lLenLine = ((lBmpWidth * 3 + 3) \ 4) * 4
ReDim aPict(0 To 39 + lBmpHeight * lLenLine) As Byte
aPict(0) = 40: aPict(12) = 1: aPict(14) = 24:
CopyMemory aPict(4), lBmpWidth, ByVal 4
CopyMemory aPict(8), lBmpHeight, ByVal 4
CopyMemory aPict(20), lLenLine, ByVal 4
Select Case bRotate
Case Is < 2 '1. 0 stopni
lStep = 3
lOffset = 40
lStep0 = 0: lStep1 = 1: lStep2 = 2
Case 2 '2. 90 stopni w prawo
lStep = -4
lOffset = UBound(aPict) - 1
lStep0 = -2: lStep1 = -1: lStep2 = -0
Case Is = 3 '3. 180 stopni w prawo
lStep = -3
lOffset = UBound(aPict) + _
IIf((bModuleSize Mod 4) = 0, 0, _
(bModuleSize Mod 4) - 4)
lStep0 = -2: lStep1 = -1: lStep2 = -0
Case Else '4. 270 stopni w prawo
lStep = 4
lOffset = 40
lStep0 = 0: lStep1 = 1: lStep2 = 2
End Select
' margines lewy
For i = 1 To Abs(lMarginLeft) * bModuleSize
aPict(lOffset + lStep0) = 255 'Blue
aPict(lOffset + lStep1) = 255 'Green
aPict(lOffset + lStep2) = 255 'Red
lOffset = lOffset + lStep
Next
' obszar kodu paskowego
For i = LBound(aPixInBar) To UBound(aPixInBar)
fBlack = Not fBlack
For j = 1 To (aPixInBar(i) - 48) * bModuleSize
' czarny pasek
If fBlack Then
aPict(lOffset + lStep0) = 0
aPict(lOffset + lStep1) = 0
aPict(lOffset + lStep2) = 0
Else
aPict(lOffset + lStep0) = 255
aPict(lOffset + lStep1) = 255
aPict(lOffset + lStep2) = 255
End If
lOffset = lOffset + lStep
Next
Next
' margines prawy
For i = 1 To Abs(lMarginRight) * bModuleSize
aPict(lOffset + lStep0) = 255
aPict(lOffset + lStep1) = 255
aPict(lOffset + lStep2) = 255
lOffset = lOffset + lStep
Next
img.SizeMode = acOLESizeStretch
' dopasuj formant do wiekszego wymiaru kodu paskowego
If fFitImg = True Then
img.BorderStyle = 0
If lBmpHeight = 1 Then
Call ResizeControl(img, lBmpWidth)
Else
Call ResizeControl(img, , lBmpHeight)
End If
End If
img.PictureData = aPict()
End Sub
'______________________________________
Private Sub ResizeControl( _
ctl As Control, _
Optional ByVal lWidthPix As Long = 0, _
Optional ByVal lHeightPix As Long = 0)
Dim lHdc As Long
Dim lWidth As Long
Dim lHeight As Long
lHdc = GetDC(Application.hWndAccessApp)
If lWidthPix > 0 Then
' dla bitmap poziomych
lWidth = lWidthPix * CSng(1440 / _
GetDeviceCaps(lHdc, LOGPIXELSX))
If lWidth > (21.5 * 1440 + ctl.Left) Then
lWidth = (21.5 * 1440 - ctl.Left)
End If
ctl.Width = lWidth
End If
If lHeightPix > 0 Then
' dla bitmap pionowych
lHeight = lHeightPix * CSng(1440 / _
GetDeviceCaps(lHdc, LOGPIXELSY))
If lHeight > (21.5 * 1440 - ctl.Top) Then
lHeight = (21.5 * 1440 - ctl.Top)
End If
ctl.Height = lHeight
End If
Call ReleaseDC(Application.hWndAccessApp, lHdc)
End Sub
[...]
--
Pozdrowienia
BraZby