ã¯ããã«
çŸåšãQRã³ãŒãïŒã¯ã€ãã¯ã¬ã¹ãã³ã¹ïŒã¯ããŸããŸãªåéã§åºã䜿çšãããŠããŸãã QRã³ãŒãã®æ§é ã¯ã
忣åã«ãã£ãŠæ¥æ¬ã§éçºãããŸããã
ãHabrahabrãã®èªè
ãšãæ©æ¢°åºç¹åœ¢åŒTajima DSTã§QRã³ãŒããçæããæ¹æ³ãå
±æããããšæããŸãã ãã®æ¹æ³ã«ãããQRã³ãŒãã®äœæãšãçµæãšããŠåŸãããç»åã®æ©æ¢°åºç¹ãã¶ã€ã³ãžã®å€æã®ããã®æåæäœãäžèŠã«ãªããŸãã ããªããŸãã¯ããªãã®ç¥äººãåºç¹æ©ãæã£ãŠããå Žåãçµæã®ãã¡ã€ã«ãæ©æ¢°ã®ã¡ã¢ãªã«ããŠã³ããŒãããŠåºç¹ãå®è¡ãããšã次ã®ãã®ãå
¥æã§ããŸãã

åé¡
æ©æ¢°åºç¹ãæäœããããã°ã©ã ã«ã¯ãQRã³ãŒããçæããæ©èœã¯ãããŸããã QRã³ãŒãåºç¹ãã¡ã€ã«ãååŸããã«ã¯ãæåã«ãããèš±å¯ãããªã³ã©ã€ã³ãµãŒãã¹ã§QRã³ãŒãç»åãååŸããæ¬¡ã«ãã·ã³åºç¹ãšãã£ã¿ãŒã䜿çšããŠã¹ããããããã¯ã«å€æããå¿
èŠããããŸãã 1ã€ãŸãã¯2ã€ã®QRã³ãŒãã®å Žåããã®ã¢ãããŒãã¯åãå
¥ããããŸãã ç¡å¶éã®æ°ã®QRã³ãŒããçæããã«ã¯ãæåæäœãé€å€ããå¿
èŠããããŸãã
解決ç
ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããŠQRã³ãŒããç¬èªã«äœæããååã§ååŸãããããªãã¯ã¹ã䜿çšããŠãé£ç¶çã«ç§»åãããããªãã¯ã¹ã»ã«ã®ã¹ãããã»ãããæ§ç¯ããŸãã QRã³ãŒãã®å質ãé«ããããã«ããµããŒãããæ£æ¹åœ¢ãåå¥ã«åœ¢æããŸãããã®ããããããªãã¯ã¹ã6ã€ã®é åã«åå²ããŸãã

åºç¹ã¯ãåºç¹æ©ã¢ãã«Brother NV 90Eã§ãã¹ããããŸããã
å
¥åã®èª¬æ
å
¥åæååã¯ãé»åååºïŒVCARDïŒã®åœ¢åŒã§ããå Žåããããå°ççäœçœ®ïŒGEOïŒã«é¢ããæ
å ±ãå«ãå ŽåããããŸãã ãŸããåãªãããã¹ããŸãã¯URLã®æååã«ããããšãã§ããŸãã
VCARDãšããŠã®å
¥åããŒã¿ïŒ
BEGIN:VCARD VERSION:3.0 FN:..., . N:;;;.,... ORG: URL:http://ru.wikipedia.org/_ EMAIL;TYPE=INTERNET:vasya.kvakin@example.com END:VCARD
VCARD圢åŒã®å®å
šãªèª¬æã¯
ããã«ãã
ãŸã ã
å°ç座æšåœ¢åŒã®å
¥åããŒã¿ãæåã®åº§æšã¯çµåºŠã2çªç®ã®åº§æšã¯ç·¯åºŠã§ãã
GEO:30.31616, 59.95015
ã¢ããªã±ãŒã·ã§ã³ã®èª¬æ
ã¢ããªã±ãŒã·ã§ã³ã¯CïŒã§èšè¿°ãããŠããŸãã ã©ã€ãã©ãªã¯ãMessagingToolkit.QRCodeã䜿çšããŸããããã«ãããçä¿¡æ
å ±è¡ã®QRã³ãŒããäœæã§ããŸãã ã©ã€ãã©ãªã¯ãããã±ãŒãžãããŒãžã£ãŒã³ã³ãœãŒã«ãä»ããŠ
nuget.orgã®ããã±ãŒãžã«ãã£ãŠã€ã³ã¹ããŒã«ãããŸãã
PM> Install-Package MessagingToolkit.QRCode
QRã³ãŒãã®ãããªãã¯ã¹ã¯ãè«çå€ã®2次å
é
åãšããŠåœ¢æãããŸãã
QRã³ãŒãã®ãããªãã¯ã¹ãåãåã£ãããæ¬¡ã®ã¹ãããã«é²ã¿ãŸã-ããããã¹ãããã®ã·ãŒã±ã³ã¹ã圢æããããã®ã©ã€ã³ã®ãªã¹ãã圢æããŸãã
è¡ããééã®ãªãQRã³ãŒãã®é£ç¶ããã»ã«ã®ã»ãããšèŠãªããŸãã QRã³ãŒãã®ãµããŒããã¬ãŒã ã®å Žåãã©ã€ã³ã¯åçŽãŸãã¯æ°Žå¹³ã®ããããã§ãã äžé£ã®ç·ã䜿çšããŠãã¹ãããã®ãããã¯ã圢æããŸãã
QRã³ãŒãã®è§ã«3ã€ã®åç
§é·æ¹åœ¢ããããŸãã ãããªãã¯ã¹ã6ã€ã®é åã«åå²ããŸãã æåã®é åã¯å·Šäžã®é·æ¹åœ¢ã§ãã¹ããããæåã«åœ¢æãããŸãã é·æ¹åœ¢ã®ã¹ãããã¯ãäžè¬çãªå Žåã®ããã«åçŽã®åã§ã¯ãªãããã®ãã¹ãŠã®èŸºã«å¯ŸããŠé çªã«åœ¢æãããŸãã æ¬¡ã«ãå·Šäžã®æ¯æé·æ¹åœ¢ãšå·Šäžã®æ¯æé·æ¹åœ¢ã®éã®ç·ã«ã¹ãããã圢æãããŸãã 奿°åã®ã¹ãããã¯äžããäžã«åœ¢æãããŸãã å¶æ°åã®å Žåãã¹ãããã¯äžããäžã«åœ¢æãããŸãã ãã®äžé£ã®ã¹ãããã«ãããäžããäžãžããŸãã¯ãã®éã®é·ã糞ã®ç§»è¡ããªããªããŸãã 4çªç®ã®é åã¯ã2çªç®ãšåæ§ã«åœ¢æãããæå€§ã®é åã§ãã 5çªç®ã®é åã¯ãå³äžé
ã«ããåç
§é·æ¹åœ¢ã§ãã 6çªç®ã®é åã¯æåŸã®é åã§ããããã®åã®ã¹ãããã圢æãããŸããäžããäžã奿°ããäžãŸã§ã§ãã
QRCodeCreatorã¯ã©ã¹
ãã®ã¯ã©ã¹ã¯ãMessagingToolkit.QRCode.Codecåå空éã䜿çšããŠã次ã®ã¡ãœããã§QRã³ãŒããããªãã¯ã¹ãçæããŸãã
using System.Text; using MessagingToolkit.QRCode.Codec; namespace EmbroideryFile.QRCode { internal class QRCodeCreator { public bool[][] GetQRCodeMatrix(string DataToEncode) { if (string.IsNullOrEmpty(DataToEncode)) return new bool[1][]; QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(); qrCodeEncoder.CharacterSet = "UTF8"; qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; qrCodeEncoder.QRCodeScale = 1; qrCodeEncoder.QRCodeVersion = -1; qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L; return qrCodeEncoder.CalQrcode(Encoding.UTF8.GetBytes(DataToEncode)); } } }
CharacterSetã¯ãããªã«æåããšã³ã³ãŒãã§ããããã«UTF8ãã€ã³ã¹ããŒã«ããŸãã
QRCodeErrorCorrectããããã£ãQRCodeEncoder.ERROR_CORRECTION.Lã«èšå®ããŸã-ãšã³ã³ãŒãäžã®äœã¬ãã«ã®åé·æ§ã
èªã¿åãæã®éå°ãªããŒã¿åé·æ§ã¯å¿
èŠãªããšèããŠããŸãã
å
¥åè¡ã«ããªã«æåãå«ãŸããŠããå Žåããã¡ã€ã«ã¯UTF8ãšã³ã³ãŒãã§ä¿åããå¿
èŠããããŸãã
ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãQRCodeStitcherã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§äœæãããŸãã
QRCodeStitcherã¯ã©ã¹
ãã®ã¯ã©ã¹ã§ã¯ãããããçš®é¡ã®ã¹ããããããã¯ã®åœ¢æãå®è£
ãããŠããŸãããããã¯æ¬¡ã®æé ã§ä¿èšŒãããŸãã
- 6ã€ã®é åã®ããããã«ã€ããŠé£ç¶ç·ã®ãªã¹ããäœæããŸãã
- è¡ã®ãªã¹ãäžã®åé åã®ã¹ãããçæã
QRã³ãŒããããªãã¯ã¹ã«åçŽç·ã®ãªã¹ããäœæããã«ã¯ãåçŽåã®ã»ã«ã調ã¹ãŠãçŸåšã®ã»ã«ã空ã®çµæã®ãªã¹ãã«çŸåšã®è¡ã远å ããŸãã äŸå€ã¯ãQRã³ãŒãã®ç«¯ã«ããåç
§æ£æ¹åœ¢ã§ãã ãªã¹ãã®åèŠçŽ ã«ã¯ãéå§ç¹ãè¡ã®çµäºç¹ããã®é·ããããã³QRã³ãŒãè¡åã®æåŸã®è¡ã«å
¥ãè¡ã®æäžäœã»ã«ã®ç¬Šå·ã«é¢ããããŒã¿ãå«ãŸããŸãã
瞊座æšãšæšªåº§æšã®è»žã«æ²¿ã£ãåãã®åçŽç·ã«å¯ŸããŠã¹ãããã圢æããããšãããããã¯åºå®å€ãæã¡ãŸãïŒdX = 25; dY = 2; QRã³ãŒãã®ã»ã«ãµã€ãºãåºå®ãããŠããŸãïŒcellSize = 25åäœã ããã®åäœã¯0.1 mmã§ãã
ã©ã€ã³ããŒã¿ã¢ãã«ã¯ãæ¬¡ã®æ§é ãšããŠè¡šç€ºãããŸãã
public struct Line { public Coords Dot1 { get; set; } public Coords Dot2 { get; set; } public int Length { get; set; } public bool Lowest { get; set; } }
以äžã®æ¹æ³ã¯ãQRã³ãŒãã®åè¿°ã®6ã€ã®é åãã¹ãŠã«å¯ŸããŠã¹ãããã®ãããã¯ã圢æããŸãã
private List<List<Coords>> GenerateQRCodeStitchesBoxed() { var blocks = new List<List<Coords>>(); int rectSize = GetRectSize();
GetRectangleSatinïŒïŒã¡ãœããã¯ãæãå€åŽã®ã»ã«ã®åº§æšã«ã¹ãããã®æ£æ¹åœ¢ã®ãããã¯ãäœæããŸãã
IEnumerable<List<Coords>> GetRectangleSatin(int x1, int y1, int x2, int y2) { int LeftX = (x1 > x2) ? x2 : x1; int TopY = (y1 > y2) ? y2 : y1; int RightX = (x1 < x2) ? x2 : x1; var BottomY = (y1 < y2) ? y2 : y1; int length = RightX - LeftX; var rect = new List<List<Coords>>(); rect.Add(GenerateVerticalColumnStitchBlock(LeftX, TopY, length)); rect.Add(GenerateHorizonColumnStitchBlock(LeftX, BottomY, length)); rect.Add(ReverseCoords(GenerateVerticalColumnStitchBlock(RightX, TopY + 1, length))); rect.Add(ReverseCoords(GenerateHorizonColumnStitchBlock(LeftX + 1, TopY, length))); return rect; }
次ã®ã¡ãœããã¯ãQRã³ãŒãã®ãµããŒãé åã®å
åŽã®æ£æ¹åœ¢ãçæããããã®QRã³ãŒããäœæããŸãã
äžé£ã®åçŽç·ã®ã¹ãããã®ãããã¯ã¯ãæ¬¡ã®æ¹æ³ã§åœ¢æãããŸãã
æ¬¡ã®æ¹æ³ã§ããšãªã¢2ã4ã6ã®è¡ã®ãªã¹ããçæãããŸãã åç·çµäºãã§ãã¯ã¯ãConsumeRelativeCellDownïŒïŒããã³ConsumeRelativeCellUpïŒïŒã¡ãœããã§å®è¡ãããŸãã
QRã³ãŒãã®å¶æ°åã®è¡ã®ãªã¹ããäœæãããšãã«ãConsumeRelativeCellDownïŒïŒã¡ãœãããåŒã³åºãããŸãã
QRã³ãŒãã®å¥æ°åã®è¡ã®ãªã¹ããäœæãããšãã«ãConsumeRelativeCellUpïŒïŒã¡ãœãããåŒã³åºãããŸãã
void ConsumeRelativeCellUp(int j, int i) { if (_cells[j][i] == true) {
å¶æ°åã¯äžããäžã«ã奿°åã¯äžããäžã«åºç¹ãããŸããããã«ãããQRã³ãŒãã»ã«ã®æ¬¡ã®åã«ç§»åããéã®ç³žã®åãã®é·ãã¹ãããããªããªããŸãã æ¬¡ã®ã³ãŒãã¯ãã©ã€ã³ã«ã¹ãããã远å ããããã®ããžãã¯ãå®è£
ããŠããŸãã
QrcodeDstã¯ã©ã¹
ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãDstFileã¯ã©ã¹ãšQrCodeStitcherã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã
public QrcodeDst() { _dst = new DstFile(); _stitchGen = new QrCodeStitcher(); }
ãã®ã¯ã©ã¹ã«ã¯ã次ã®ããããã£èšå®ã¡ãœããããããŸãã
public QRCodeStitchInfo QrStitchInfo { set { _stitchGen.Info = value; } }
QrcodeDstã¯ã©ã¹ã¯ãQRã³ãŒããTajima DSTãã·ã³åºç¹åœ¢åŒã§ä¿åããFillStreamWithDstïŒã¹ããªãŒã ã¹ããªãŒã ïŒã¡ãœãããå®è£
ããŸããGetQRCodeStitchBlocksïŒïŒã¡ãœããã¯ãåºç¹çšã®ã¹ããããããã¯ã®åœ¢æããæåã®ã¹ãããããžã£ã³ãã¹ããããã¹ãããã¹ããããã瀺ãè¿œå æ
å ±ãšãšãã«æäŸããŸãã QrcodeDstã¯ã©ã¹ã®QrStitchInfoããããã£ã¯ãå
¥åæ
å ±ãæååãšããŠåãåããQRã³ãŒããããªãã¯ã¹ãä¿åããããã®ãã®ã§ãã
ã¯ã©ã¹ã¡ãœããDstFile WriteStitchesToDstStreamïŒïŒã¯ã座æšããŒã¿ã®ãªã¹ããšStreamã®ã€ã³ã¹ã¿ã³ã¹ããã©ã¡ãŒã¿ãŒãšããŠåãåããã¹ãããããŒã¿ããã·ã³åºç¹åœ¢åŒã§æžã蟌ã¿ãŸãã
次ã®ã³ãŒãã¯ããã¡ã€ã«ãããšã³ã³ãŒãçšã®ããŒã¿ãèªã¿åããQrcodeDstã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠãQRã³ãŒãã¹ãããã®ã·ãŒã±ã³ã¹ããã·ã³åºç¹ãã¡ã€ã«ã«ä¿åããŸãã
var qrcodeGen = new QrcodeDst(); using (var inputStreamReader = new StreamReader(fileName)) { var text = inputStreamReader.ReadToEnd(); using (Stream outStream = new FileStream(outputPath, FileMode.Create, FileAccess.Write)) { if (qrcodeGen != null) { qrcodeGen.QrStitchInfo = new QRCodeStitchInfo {QrCodeText = text}; qrcodeGen.FillStream(outStream); } } }
åºç¹ãä¿åããããã®ãã¡ã€ã«åœ¢åŒã«ã€ããŠã¯ãæ¬¡ã®æ®µèœã§èª¬æããŸãã
DSTãã¡ã€ã«åœ¢åŒ
ã¹ããã座æšããã€ãã«å€æããããã«
ãããããã®DSTãã¡ã€ã«åœ¢åŒã®èª¬æ
ã䜿çšãããŸãã ã ã¹ãããã®ã·ãŒã±ã³ã¹ã¯ãåã®ã¹ãããã«å¯Ÿãããšã³ã³ãŒãããããªãã»ãããšããŠä¿åãããŸãã ã€ãŸãããã¡ã€ã«ã«ã¯ãã¹ãããã®çš®é¡ã瀺ãã¹ã¬ãããç§»åããããã®åœä»€ãä¿åãããŸãã
å¯èœãªã¹ãããã¿ã€ãïŒ
â¢éåžž
â¢ç§»è¡
â¢åæ¢
æåã§è¡ãå Žåãã¹ããããç Žãã糞ã倿Žã§ããŸãã
DSTãã¡ã€ã«ã«ã¯ããããŒããããã¹ãããããŒã¿ã¯ãã€ãã«çªå·ãä»ãããšãã«512ãã€ãç®ããå§ãŸããŸã
ãŒãããã
ã¹ãããã¯3ãã€ãã§ãšã³ã³ãŒããããŸãïŒ
ãããæ° | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ãã€ã1 | y + 1 | y-1 | y + 9 | y-9 | x-9 | x + 9 | x-1 | x + 1 |
ãã€ã2 | y + 3 | y-3 | y + 27 | y-27 | x-27 | x + 27 | x-3 | x + 3 |
ãã€ã3 | ç§»è¡ | æ¢ãŸã | y + 81 | y-81 | x-81 | x + 81 | åžžã«ã€ã³ã¹ããŒã«ããã | åžžã«ã€ã³ã¹ããŒã«ããã |
ãžã£ã³ãããããšã¹ããããããã¯åæã«èšå®ã§ããŸãã ããã¯ãé·ãé·ç§»ãšã¹ã¬ããã®åæå€æŽã«å¿
èŠã§ãã
DSTãã¡ã€ã«ã¯3ãã€ãã§çµããå¿
èŠããããŸãïŒ00 00 F3ã
以äžã¯ãåã®äœçœ®ãåºæºã«ããã¹ã¬ããã®åãã®å€ã®ã¹ããããã€ããè¿ãã³ãŒãã§ãã
byte[] encode_record(int x, int y, DstStitchType stitchType) { byte b0, b1, b2; b0 = b1 = b2 = 0; byte[] b = new byte[3];
QRã³ãŒãã®æ©æ¢°åºç¹ã®åœ¢æã¯
ãªã³ã¯ã§èŠãããšãã§ããŸãã

QRã³ãŒãã®æ©æ¢°åºç¹ã®ãœãŒã¹ã³ãŒããããŠã³ããŒãããã«ã¯ã
次ã®ãªã³ã¯ããããŠã³ããŒãã§ããŸãã
åºç¹ãã¡ã€ã«ã圢æããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ã
åç
§ããŠããŠã³ããŒãã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ãããã©ã«ããŒã«ã¯ãå¿
èŠãªã©ã€ãã©ãªãå®è¡å¯èœãã¡ã€ã«ãããã³ãšã³ã³ãŒãçšã®æ
å ±ãå«ãããã¹ããã¡ã€ã«ããããŸãã
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã«ã¯ãã³ãã³ãããã³ããã§æ¬¡ãå
¥åããŸãã
qrcodegen.exe test.asc
ã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãããã©ã«ããŒã«æ¡åŒµå.DSTã®ãã¡ã€ã«ãçæããŸãã SVGãã¯ã¿ãŒãã¡ã€ã«ãšPNGã©ã¹ã¿ãŒãã¡ã€ã«ãäœæããããšãã§ããŸãã ãã¡ã€ã«ã¯ãããšãã°
http://florianisoftware.comã®ãããªæ©æ¢°åºç¹ç·šéããã°ã©ã ã§éãããšãã§ããŸãã
é¢é£ãªã³ã¯
â¢
Nathan Crawfordã®ãµã€ã -ãã®ãµã€ãã®ã³ãŒãã¯ãæ©æ¢°åºç¹ã®PNGãã¡ã€ã«ãäœæããããã®åºç€ãšããŠäœ¿çšãããŸããã
â¢
ã«ãã«ãã®ããŒã ããŒãž Taijama DST圢åŒã®èª¬æ
â¢
Embroidermodderãµã€ã -Embroidermodderã¯ãæ©æ¢°åºç¹ãã¶ã€ã³ã§äœæ¥ããããã®ç¡æããŒã«ã§ã