Vonalkód hosszúságának rövidítése.

Vonalkód hosszúságának rövidítése.
2022-06-10T13:13:31+02:00
2022-07-27T09:46:04+02:00
2022-10-15T21:21:37+02:00
vargajoc62
Sziasztok. Van egy ilyen vonalkód generáló kis programocska. Teljesen jól működik de most cimkecsere miatt túl hosszú a vonalkód és nem fér el a cimkén. A feltöltött fájlban a bal oldali a régi a jobb oldali ami szükséges lenne. A charactereknél csak a kisbetűk és a számok kellenek. Hogy kellene átalakítani ezt a programot? Előre is köszönöm a segítséget.
• ?> • < • < ?php • global $char128asc,$char128charWidth; • $char128asc=' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'; • $char128wid = array( • '212222','222122','222221','121223','121322','131222','122213','122312','132212','221213', // 0-9 • '221312','231212','112232','122132','122231','113222','123122','123221','223211','221132', // 10-19 • '221231','213212','223112','312131','311222','321122','321221','312212','322112','322211', // 20-29 • '212123','212321','232121','111323','131123','131321','112313','132113','132311','211313', // 30-39 • '231113','231311','112133','112331','132131','113123','113321','133121','313121','211331', // 40-49 • '231131','213113','213311','213131','311123','311321','331121','312113','312311','332111', // 50-59 • '314111','221411','431111','111224','111422','121124','121421','141122','141221','112214', // 60-69 • '112412','122114','122411','142112','142211','241211','221114','413111','241112','134111', // 70-79 • '111242','121142','121241','114212','124112','124211','411212','421112','421211','212141', // 80-89 • '214121','412121','111143','111341','131141','114113','114311','411113','411311','113141', // 90-99 • '114131','311141','411131','211412','211214','211232','23311120' ); // 100-106 • function bar128($text) { • global $char128asc,$char128wid; • $w = $char128wid[$sum = 104]; • $onChar=1; • for($x=0;$x<strlen($text);$x++) • if (!( ($pos = strpos($char128asc,$text[$x])) === false )) { • $w.= $char128wid[$pos]; • $sum += $onChar++ * $pos; • } • $w.= $char128wid[ $sum % 103 ].$char128wid[106]; • $html="<table cellpadding=0 cellspacing=0><tr>"; • for($x=0;$x<strlen($w);$x+=2) • $html .= "<td><div class="b128" style="border-left-width:{$w[$x]};width:{$w[$x+1]}"></div></td>"; • return "$html<tr><td colspan=".strlen($w)." align=left><font family=arial size=1>$text</td></tr></table>"; • } • ?>
Mutasd a teljes hozzászólást!
Code 128 includes 108 symbols: 103 data symbols, 3 start symbols, and 2 stop symbols

Mindegy, mennyit használsz, 103-mal kell osztani akkor is. Nem is értem, mi az, hogy neked csak 102 szimbólumod van. Ám mindegy, neked mennyi van, ha Te máshogy számolod a checksumot, mint ahogy a szabvány szerint kellene, akkor értelemszerűen más fog kijönni.
Mutasd a teljes hozzászólást!

  • Próbáld meg beilleszteni a kódot tagolva, forráskódként, hogy esetleg értelmezni is tudjunk belőle valamit.
    Mutasd a teljes hozzászólást!
  • Bocsi de azt hogy tudom megcsinálni?
    Mutasd a teljes hozzászólást!
  • A szerkesztőmezőben megnyomod azt a gombot, ami így néz ki: </>

    Így kapsz egy más színű mezőt, amibe a forráskódot beírhatod, és azt a fórummotor változtatás nélkül (*), fix betűmérettel fogja kiírni. A cél az, hogy olyasmi formában jelenjen meg a kód nekünk, mint amit te látsz a kódszerkesztőben, nem pedig valami katyvasz legyen belőle.

    (*) Kivéve, hogy a visszafelé perjeleket megfelezi a motor, de ezt a problémát deklaráltan nem fogják kijavítani. Kvázi át lett minősítve feature-nek.
    Mutasd a teljes hozzászólást!
  • <?php ?> <style> div.b128{ border-left: 1px black solid; height: 30px; } </style> <?php global $char128asc, $char128charWidth; //$char128asc=' !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'; $char128asc = ' 0123456789'; $char128wid = array( '212222', '222122', '222221', '121223', '121322', '131222', '122213', '122312', '132212', '221213', // 0-9 '221312', '231212', '112232', '122132', '122231', '1k_nyomtatva13222', '123122', '123221', '223211', '221132', // 10-19 '221231', '213212', '223112', '312131', '311222', '321122', '321221', '312212', '322112', '322211', // 20-29 '212123', '212321', '232121', '111323', '131123', '131321', '112313', '132113', '132311', '211313', // 30-39 '231113', '231311', '112133', '112331', '132131', '113123', '113321', '133121', '313121', '211331', // 40-49 '231131', '213113', '213311', '213131', '311123', '311321', '331121', '312113', '312311', '332111', // 50-59 '314111', '221411', '431111', '111224', '111422', '121124', '121421', '141122', '141221', '112214', // 60-69 '112412', '122114', '122411', '142112', '142211', '241211', '221114', '413111', '241112', '134111', // 70-79 '111242', '121142', '121241', '114212', '124112', '124211', '411212', '421112', '421211', '212141', // 80-89 '214121', '412121', '111143', '111341', '131141', '114113', '114311', '411113', '411311', '113141', // 90-99 '114131', '311141', '411131', '211412', '211214', '211232', '23311120'); // 100-106 function bar128($text) { global $char128asc, $char128wid; $w = $char128wid[$sum = 104]; // $onChar = 1; for ($x = 0; $x < strlen($text); $x++) if (!( ($pos = strpos($char128asc, $text[$x])) === false )) { $w.= $char128wid[$pos]; $sum += $onChar++ * $pos; } $w.= $char128wid[$sum % 103] . $char128wid[106]; $html = "<table cellpadding=0 cellspacing=0><tr>"; for ($x = 0; $x < strlen($w); $x+=2) $html .= "<td><div class="b128" style="border-left-width:{$w[$x]};width:{$w[$x + 1]}"></div></td>"; return "$html<tr><td colspan=" . strlen($w) . " align=left><font family=arial size=1>$text</td></tr></table>"; } ?>
    Mutasd a teljes hozzászólást!
  • '1k_nyomtatva13222'
    LOL

    Elfelejtetted csatolni a fájlt arr, hogy mit is szeretnél pontosan.
    Mutasd a teljes hozzászólást!
  • A bal oldali a mostani és a jobb oldali méret kellene

    valamit félrenyomtam.
    '1k_nyomtatva13222' = '113222'
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Valami nem stimmel, beolvastatva a hosszabbat, az olvasó program csak káromkodik, azt mondja: ##%)#*

    Viccen kívül, a rövid kód 128c start kódot használ, a tied meg 128a-t. A 128c direkt azért lett kitalálva, hogy számsorokat tömören ábrázoljon. További részletekhez olvasd el a leírást itt:

    Code 128 - Wikipedia

    Válasz a kérdésedre: módosítsd a kódot úgy, hogy Code 128, C kódlapot használjon.
    Mutasd a teljes hozzászólást!
  • Itt van még ez is, igazán kedvező ára van, és a trial verzióval kipróbálhatod, tudja-e azt, ami neked kell.

    Barcode symbology comparison to choose the right barcode type
    Mutasd a teljes hozzászólást!
  • Mivel ez a programocska egy program szerves része, ezt kellene átalakítani. A külön program nem opció. Néztem a Wikipedia linket.  Igazából nem jöttem rá mi az amin módosítani kellene. Ehhez kérnék gyakorlati tanácsokat.
    Mutasd a teljes hozzászólást!
  • Ha a gyakorlati segítség alatt azt érted, hogy írjak konkrét PHP kódsorokat, azt tőlem nem fogsz kapni, több okból is, amit nem fogok részletezni.

    Már írtam, hogy miért hosszabb a tied, mint a régi: a kódod minden számjegyet külön-külön elkódol, három vonal és három szóköz lesz benne minden számhoz, ezt nevezik 128A ill. 128B Code Set-nek. A start szimbólumokat megnézve látszik, hogy a baloldali cimke Start Code B szimbólummal kezdődik, a jobboldali pedig Start Code C-vel. Már leírtam, hogy miben különbözik a kettő, de újra: 128C Code Set két számjegyet (pl. 1 és 2, vagyis 12)  három pálcikával jelöl, míg a 128B pedig 6-tal, ezért a baloldali kb. kétszer hosszabb lesz.

    Azt hittem, ebből már nyilvánvaló, hogy annyit kell csak módosítanod a gyakorlatban, hogy a karakterenkénti (számonkénti) kódolást lecseréled úgy, hogy a belső ciklusod kettesével megy végig a számokon, és azokhoz a megfelelő kódot rendeli ugyanabból a táblázatból, ami már most is ott van a program elején. A hozzárendelés konkrétan benne van a Wikipédia leírásban, pl. 12 -> 112232. (Kb. a lap harmadánál találod, a Bar code widths bekezdésben, a táblázat 128C és widths oszlopait kell nézni.) Valamint ne felejtsd el lecserélni a start kódot, hogy Start Code C-vel kezdődjön. (211232)

    Ha még mindig nem tiszta, megfelelő díjazás ellenében meg tudom írni Neked a kódot is, de szerintem, meg fogod tudod ezt Te oldani önállóan is.
    Mutasd a teljes hozzászólást!
  • Csatolt fájlban látszik, hogy nem levegőbe beszélek, a QRDroid beolvassa mindkettőt a képernyőről. :D
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Szia!
    Igaza lehet Hoszának!
    Ott van a megoldás az általa küldött Wiki linken.
    Én ezt most nem tudom neked átalakítani, de adok ötletet.
    Van a Wiki link alján egy táblázat az értékekhez tartozó kódokkal. A te kódodban átírod a 128A hoz tartozó start/stop  értékeket a 128C -re. Azután nem karakterenként vizsgálod a kiirandó szöveget hanem két karakterenként. valamint a nagy tömbödet átírod a táblázat szerint a 128C értékeire.
    Mutasd a teljes hozzászólást!
  • Szia!
    Manuálisan le ellenőriztem.
    Hosza által linkelt Wiki oldal szerint működik. Kézzel megcsináltam a 128C kódtábla alapján az általad is linkelt 224822 -es tartalmú bar code -ot.
     A tartalma:

    start 11010011100 105 (1x105 =105) 22 11001110100 22 (1x22 =22) 48 11101110110 48 (2x48 =96) 29 11100110010 29 (3x29 =87) check 11001101100 1 ( (105+22+96+87) % 103 ) stop 11000111010
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ez még kicsi hiányos, a lezáró rész 4 csíkból kell álljon és az elején-végén legyen egy 10 modul széles "csendes zóna". A QRDroid több másodperc küszködés után ugyan belovasta ezt valahogy, de másodszorra már nem sikerült neki.
    Mutasd a teljes hozzászólást!
  • Ha páratlan sok számot akar esetleg elkódolni, akkor már nem lesz annyira rövid a vonalkód, mert át kell váltania az A vagy B kódolásra és kódolni kell a maradék egy db számjegyet, ami összesen plusz 6 csíkot jelent (22 modulnyi szélesség), ezért ha megengedhető egy "padding" 0 használata valahol, akkor azzal is lehet nyerni összesen 11 modulnyi helyet.

    barcode128c - Image on Pasteboard
    Mutasd a teljes hozzászólást!
  • Nem is gondoltam, hogy ilyen "jó móka" vonalkódot generálni "kézzel", mindjárt rámegyek a 2D-s kódokra is, mint pl. a Datamatrix vagy a QRCode :D
    Mutasd a teljes hozzászólást!
  • A táblázat szerint a stop : 11000111010
     A csendes terület valóban kicsire vetem előtte/utána 3-3 szabad helye hagytam.
    Nekem a telefonom azonnal elolvassa.
    Páratlan karakterekből álló számnál én kipróbálnám a 01-09 kezdettel és akkor szerintem kiadja. csak nem ír már 0 -át az elejére. De ezt ki kéne próbálni.
    Mutasd a teljes hozzászólást!
  • Köszönöm a témával kapcsolatos tanácsokat.  Ahogy lesz egy kis időm nekiállok a fentiek alapján.
    Valószínű, hogy kérek még tanácsot ezzel kapcsolatban
    Mutasd a teljes hozzászólást!





  • Stop pattern (7 bars/spaces)
    206 / 211 / 251
    Î / Ó / û
    1100011101011
    2331112




    Hivatalosan ki kellene rakni a végére még egy extra, 2 széles vonalat, de ha okos az olvasó programod, akkor így is elfogadja simán. 

    The minimum width of the quiet zone to the left and right of the Code 128 is 10x, where x is the minimum width of a module. It is mandatory at the left and right side of the barcode.

    Elítam, nem 11, hanem 10...
    Mutasd a teljes hozzászólást!
  • Jó ez a bohóckodás, de van kismillió ttf erre, amivel kb. 1 soros lesz az implementációd.
    Mutasd a teljes hozzászólást!
  • TTF Ezek közül melyik TTF?

    Mindegy, topicnyitó leírta, hogy nem jó neki kész komponens, library, mert "... ez a programocska egy program szerves része, ezt kellene átalakítani. A külön program nem opció."
    Mutasd a teljes hozzászólást!
  • :D nyilván a "Time To Fly", mert az pont idevág!

    Igazából szerintem a True Type Font, nem külső program, nem library és nem is komponens.
    Kb. ennyi lenne a megoldás:

    <style> @font-face { font-family: 'Code128b'; src: local('Code128b') url('code128b.ttf') format('truetype') font-weight: normal; } p { font-family: 'Code128b'; } </style> <p>$123456^</p>
    Igazából lehet inline base64 is a font, vagy svg vagy akármi.
    Kb. ugyanennyi, vagy kevesebb megcsinálni ezt gd-vel és akkor kép.
    Esetleg lehetne svg-t is generálni és akkor az normálisan méretezhető is.
    Mutasd a teljes hozzászólást!
  • Na igen, láttam én is hogy vannak ilyenek is, de valamiért nem ebbe az irányba indultam...



    Megnéztem párat ebből a kismillióból, de egyik sem tudta rendesen lezárni a kódot (az utolsó hármas után van egy extra, záró vonal, ehhez nem volt glyph, ami 4 vagy 1 vonalat tartalmazna), plusz megpróbáltam két helyen is beolvastatni a demó vonalkódjukat, amit kiraktak a demóként, de nem boldogult vele az olvasó. Az elején én is gondoltam arra, hogy változó szélességű fonttal meg lehetne oldani, ahol van 3 féle vonlvastagságú függőleges vonal, de kellene hozzá 3 féle szélességű szóköz is, az pedig persze, hogy nincs általában. :)

    Szóval én ezt a "font-os" trükköt komoly dolgokra nem használnám, jobb akkor már svg-t generálni, ahogy írod.
    Mutasd a teljes hozzászólást!
  • <?php ?> <style> div.b128{ border-left: 1px black solid; height: 30px; } </style> <?php $char128csc = '0123456789'; $char128wid = array( '212222', '222122', '121223', '121223', '121322', '131222', '122213', '122312', '132212', '221213', // 0-10 '221312', '231212', '112232', '122132', '122231', '113222', '123122', '123221', '223211', '221132', // 11-20 '221231', '213212', '223112', '312131', '311222', '321122', '321221', '312212', '322112', '322211', // 21-30 '212123', '212321', '232121', '111323', '131123', '131321', '112313', '132113', '132311', '211313', // 31-40 '231113', '231311', '112133', '112331', '132131', '113123', '113321', '133121', '313121', '211331', // 41-50 '231131', '213113', '213311', '213131', '311123', '311321', '331121', '312113', '312311', '332111', // 51-60 '314111', '221411', '431111', '111224', '111422', '121124', '121421', '141122', '141221', '112214', // 61-70 '112412', '122114', '122411', '142112', '142211', '241211', '221114', '413111', '241112', '134111', // 71-80 '111242', '121142', '121241', '114212', '124112', '124211', '411212', '421112', '421211', '212141', // 81-90 '214121', '412121', '111143', '111341', '131141', '114113', '114311', '411113', '411311', '113141', // 91-100 '211232', '411131','2331112'); // 100-103 function bar128($text) { global $char128csc, $char128wid; $w = $char128wid[$sum = 100]; $onChar = 2; for ($x = 0; $x < strlen($text); $x++) if (!( ($pos = strpos($char128csc, $text[$x])) === false )) { $w.= $char128wid[$pos]; $sum += $onChar++ * $pos; } $w.= $char128wid[$sum % 99] . $char128wid[103]; $html = "<table cellpadding=0 cellspacing=0><tr>"; for ($x = 0; $x < strlen($w); $x+=2) $html .= "<td><div class="b128" style="border-left-width:{$w[$x]};width:{$w[$x + 1]}"></div></td>"; return "$html<tr><td colspan=" . strlen($w) . " align=left><font family=arial size=1>$text</td></tr></table>"; } ?> <?php
    Nézzétek el nekem a bénaságomat de majdnem 60 évesen kezdtem el a programozást autodidakta módon és így 60 felett egyre jobban érdekel. Átalakítottam amit javasoltatok, de még mindíg nem működik.  Ahogy logikailag gondolom a for ciklusban nem 2 karaktert kérdez le egyszerre. Vagy nem jól gondolom? Lehet a többi részén is kell változtatni?
    Mutasd a teljes hozzászólást!
  • Igazából nem értem, mit miért csináltál, de semmit nem fogadtál meg abból, amit mondtam.

    A kódtábla kommentjei nem jók, mert 0-10 az tizenegy elem lenne, de továbbra is csak tíz elem van soronként, nem a C kódtábla startkódját használod, elrontottad a checksum számolását, ami eddig jó volt és valóban, nem kettesével kódolod a karaktereket, mint ahogy kéne ahhoz, hogy elérd a minimális hosszt.
    Mutasd a teljes hozzászólást!
  • Nem akarok beleszólni de a 128c nem alkalmas szöveg kódolására. A 128a viszont igen. A kérdezőnél is látható, hogy nem csak számokat akar kódolni.
    De ha nincs igazam akkor bocsi.
    Mutasd a teljes hozzászólást!
  • Nem akarok beleszólni de a 128c nem alkalmas szöveg kódolására. A 128a viszont igen. A kérdezőnél is látható, hogy nem csak számokat akar kódolni.
    De ha nincs igazam akkor bocsi.
    Mutasd a teljes hozzászólást!
  • Valóban, azt írja, hogy "A charactereknél csak a kisbetűk és a számok kellenek", ám ezzel szemben a példa, _működő_ példa vonalkód, amit adott (nézd meg!), abban csak számok vannak és C kódlapot használ. Ebből indultam ki. Valamint az is fennáll, hogy az A kódolással, csak hosszabb kódot lehet legyártani, mint amit szeretne. Tehát "nem jön ki a matek", vagy C és csak számok, de legalább rövid lesz, vagy betűk is és A kód, de akkor pedig nem fog a cimkén elférni a vonalkód.
    Mutasd a teljes hozzászólást!
  • Csak megakadt raqjta a szemem. A char128wid tömb 2. és 3. indexén ugyanaz az adat szerepel. Logikusan nem lehetne benne két egyforma. Miért van mégis?
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd