Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/30: Рейтинг темы: голосов - 30, средняя оценка - 4.53
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441

Реализация штрих-кода в picturebox по ГОСТ

01.08.2014, 11:11. Показов 6485. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Требуется совет знающего человека.
Необходимо реализовать штрих-код с ГОСТовскими размерами: http://www.ean-barcode.ru/info/

Предполагаю реализовать это в picturebox, чтобы от туда можно было потом копировать в различные программы (Indesign, word и т.д.).

Я не понимаю как это правильно реализовать, чтобы при печати размеры совпадали с ГОСТ ? Всё должно быть как можно проще, т.е. сгенерировал jpeg, запихал в буфер обмена и вставил куда надо без лишней подгонки и т.д.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.08.2014, 11:11
Ответы с готовыми решениями:

Реализация ГОСТ 34.11-94 или ГОСТ 34.11-2014
Поделитесь реализацией хэш функции для подсчета контрольной сумма файла. Одну нашел. Но она работает очень медленно. Файл 10 мб считает...

Задана таблица товаров и их штрих-кодов. Вывести данные при использовании сканера штрих-кода
Привет. Есть таблица с данными: штрих-код был отсканирован сканером, а все остальные данные введены вручную соответственно. При...

Реализация ГОСТ Р 34.10-2001
Нужно реализовать стандар Электроной цифровой подписи ГОСТ Р 34.10-2001 на C# (windows form application). Имею множество отдельных классов...

24
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
01.08.2014, 11:34
Abraziv__,
Посмотрите на Barcode .NET Control
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
01.08.2014, 14:08  [ТС]
Спасибо, но что то не помогло ((((( Сам алгоритм реализовать не сложно, уже практически реализовал, осталось нарисовать ))))
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 05:50
Цитата Сообщение от Abraziv__ Посмотреть сообщение
Я не понимаю как это правильно реализовать, чтобы при печати размеры совпадали с ГОСТ ?
  1. Определиться с DPI, думаю 300 будет достаточно
  2. Исходя из требуемого размера штрих-кода, скажем как требуется 37,29×25,93 (в дюймах 1,4681×1,0209), посчитать размер Bitmap, на котором будем рисовать. Это будет 441×307 пикселей. Без учёта полей.
  3. Нарисовать, отрезки. Всего нужно 84 штриха для самого кода, 3 для ограничителей справа и слева и 5 для центрального ограничителя. Итого, 95 отрезков. Для ширины изображения 441 пиксел, ширина каждого отрезока будет равна примерно 4,64 пиксела. Это ширина пера. Берём коды цифр и рисуем штрихи, меняя цвет пера на чёрный или белый в зависимости от кода
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
02.08.2014, 05:54  [ТС]
Спасибо, я примерно так и делаю. Только размер изображения меньше получается.
Не подскажите есть ли функция, для забеливания объекта Bitmap? А то рисуется на picturebox нормально, а сохраняю чёрный весь рисунок.
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 07:16
Вот я тут наваял на досуге:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace WindowsFormsApplication1 {
    internal static class BarCode {
        const float LINE_LEN = 0.8996f;//22,85 мм
        const float SPACE_UP_DOWN = 0.013f;//0,33 мм
        const float SPACE_LEFT = 0.1429f;//3,63 мм
        const float SPACE_RIGHT = 0.0909f;//2,31 мм
        const float SEPARATOR_LINE_LEN = 0.9646f;//24,5 мм
        const float TEXT_HEIGHT = 0.1083f;//25,91 - 23,16 = 2,75 мм
        const float TEXT_POS = 0.9118f;//23,16 мм
 
        //Коды для левой шестёрки
        static uint[,] Lcode = new uint[10, 7]{
            {0,0,0,1,1,0,1},
            {0,0,1,1,0,0,1},
            {0,0,1,0,0,1,1},
            {0,1,1,1,1,0,1},
            {0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},
            {0,1,0,1,1,1,1},
            {0,1,1,1,0,1,1},
            {0,1,1,0,1,1,1},
            {0,0,0,1,0,1,1}
        };
        //Коды для правой шестёрки
        static uint[,] Rcode = new uint[10, 7]{
            {1,1,1,0,0,1,0},
            {1,1,0,0,1,1,0},
            {1,1,0,1,1,0,0},
            {1,0,0,0,0,1,0},
            {1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},
            {1,0,1,0,0,0,0},
            {1,0,0,0,1,0,0},
            {1,0,0,1,0,0,0},
            {1,1,1,0,1,0,0}
        };
        //Коды разделителей
        static uint[,] Divcode = new uint[3, 5] {
            {1,0,1,2,2},
            {0,1,0,1,0},
            {1,0,1,2,2}
        };
        static Pen pen = new Pen(Color.White, 4.64f) { Alignment = PenAlignment.Right };
        static internal Bitmap DrawEAN13(string barCodeNum) {
 
            Bitmap barCodeBmp = new Bitmap(441, 307);
            barCodeBmp.SetResolution(300f, 300f);
 
            float res = barCodeBmp.HorizontalResolution;
 
            int w = (int)(barCodeBmp.Width + res * (SPACE_LEFT + SPACE_RIGHT)), h = (int)(barCodeBmp.Height + 2 * res * SPACE_UP_DOWN);
            Bitmap fullImage = new Bitmap(w, h);
            fullImage.SetResolution(res, res);
 
            float textSpace = 7 * pen.Width / 6;
            PointF textPt = new PointF(0, TEXT_POS * res);//координаты текста
            Font f = new Font("Courier", TEXT_HEIGHT * 72, FontStyle.Regular);
 
            using (Graphics g = Graphics.FromImage(barCodeBmp),
                            g1 = Graphics.FromImage(fullImage)) {
                g.FillRectangle(Brushes.White, new Rectangle(0, 0, 441, 307));
 
                //Ограничитель слева
                float x = 0f, y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[0, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Левая половина кода
                int n;
                y = LINE_LEN * res;
                for (int i = 0; i < 6; i++, textPt.X += textSpace) {
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    n = int.Parse(barCodeNum[i].ToString());
                    for (int j = 0; j < Lcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
 
                //Ограничитель по центру
                y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < Divcode.GetLength(1); i++, x += pen.Width) {
                    pen.Color = Divcode[1, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Правая половина кода
                y = LINE_LEN * res;
                for (int i = 6; i < barCodeNum.Length; i++, textPt.X += textSpace) {
                    n = int.Parse(barCodeNum[i].ToString());
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    for (int j = 0; j < Rcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
                //Ограничитель справа
                y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[2, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
                g1.FillRectangle(Brushes.White, 0, 0, fullImage.Width, fullImage.Height);
                g1.DrawImage(barCodeBmp, res * SPACE_LEFT, res * SPACE_UP_DOWN);
            }
            return fullImage;
        }
        static internal void SaveBarCodeToFile(string path, string barCodeNum) {
            Bitmap bmp = DrawEAN13(barCodeNum);
            bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
            bmp.Dispose();
        }
 
    }
}

Здесь нет отступов от разделителей до кода
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
02.08.2014, 08:12  [ТС]
Добрый день. Спасибо за код.
Мне кажется у вас не правильно работает и контрольную сумму тоже не высчитывает. Я проверял на различных кодах, мой вроде похож.
Вот, что у меня получилось с тем же кодом:
Изображения
 
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 08:54
Согласен, может и накосячил где. После работы внимание уже не то. А про контрольную сумму я и не думал. Вбил цифры от фонаря
Увидел, где накосячил. В цикле для правой части нужно Lcode заменить на Rcode. Копипаст — это зло
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 10:29
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Ну вроде подправил. Мой телефон код смог прочитать, правда только если контрольная сумма совпадает.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace WindowsFormsApplication1 {
    internal static class BarCode {
        const float TOTAL_WIDTH = 1.2343f;//31,35 мм
        const float TOTAL_HEIGHT = 1.0209F;//25,93 мм
        const float LINE_LEN = 0.8996f;//22,85 мм
        const float SPACE_UP_DOWN = 0.013f;//0,33 мм
        const float SPACE_LEFT = 0.1429f;//3,63 мм
        const float SPACE_RIGHT = 0.0909f;//2,31 мм
        const float SEPARATOR_LINE_LEN = 0.9646f;//24,5 мм
        const float TEXT_HEIGHT = 0.1083f;//25,91 - 23,16 = 2,75 мм
        const float TEXT_POS = 0.9118f;//23,16 мм
 
        //Коды для левой шестёрки
        static uint[,] Lcode = new uint[10, 7]{
            {0,0,0,1,1,0,1},
            {0,0,1,1,0,0,1},
            {0,0,1,0,0,1,1},
            {0,1,1,1,1,0,1},
            {0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},
            {0,1,0,1,1,1,1},
            {0,1,1,1,0,1,1},
            {0,1,1,0,1,1,1},
            {0,0,0,1,0,1,1}
        };
        //Коды для правой шестёрки
        static uint[,] Rcode = new uint[10, 7]{
            {1,1,1,0,0,1,0},
            {1,1,0,0,1,1,0},
            {1,1,0,1,1,0,0},
            {1,0,0,0,0,1,0},
            {1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},
            {1,0,1,0,0,0,0},
            {1,0,0,0,1,0,0},
            {1,0,0,1,0,0,0},
            {1,1,1,0,1,0,0}
        };
        //Коды разделителей
        static uint[,] Divcode = new uint[3, 5] {
            {1,0,1,2,2},
            {0,1,0,1,0},
            {1,0,1,2,2}
        };
 
        static internal Bitmap DrawEAN13(string barCodeNum, float DPI = 300) {
 
            Bitmap barCodeBmp = new Bitmap((int)(TOTAL_WIDTH * DPI) + 1, (int)(TOTAL_HEIGHT * DPI) + 1);
            barCodeBmp.SetResolution(DPI, DPI);
 
            int w = (int)(barCodeBmp.Width + DPI * (SPACE_LEFT + SPACE_RIGHT)), h = (int)(barCodeBmp.Height + 2 * DPI * SPACE_UP_DOWN);
            Bitmap fullImage = new Bitmap(w, h);
            fullImage.SetResolution(DPI, DPI);
 
            Pen pen = new Pen(Color.White, TOTAL_WIDTH * DPI / 95f);
            float textSpace = 7f * pen.Width / 6f;
            PointF textPt = new PointF(0, TEXT_POS * DPI);//координаты текста
            Font f = new Font("Courier", TEXT_HEIGHT * 72f, FontStyle.Regular);
 
            using (Graphics g = Graphics.FromImage(barCodeBmp),
                            g1 = Graphics.FromImage(fullImage)) {
 
                g.FillRectangle(Brushes.White, new Rectangle(0, 0, barCodeBmp.Width, barCodeBmp.Height));
 
                //Разделитель слева
                float x = pen.Width / 2, y = SEPARATOR_LINE_LEN * DPI;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[0, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Левая половина кода
                int n;
                y = LINE_LEN * DPI;
                for (int i = 0; i < 6; i++, textPt.X += textSpace) {
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    n = int.Parse(barCodeNum[i].ToString());
                    for (int j = 0; j < Lcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
 
                //Разделитель по центру
                y = SEPARATOR_LINE_LEN * DPI;
                for (int i = 0; i < Divcode.GetLength(1); i++, x += pen.Width) {
                    pen.Color = Divcode[1, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Правая половина кода
                y = LINE_LEN * DPI;
                for (int i = 6; i < barCodeNum.Length; i++, textPt.X += textSpace) {
                    n = int.Parse(barCodeNum[i].ToString());
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    for (int j = 0; j < Rcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Rcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
                //Разделитель справа
                y = SEPARATOR_LINE_LEN * DPI;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[2, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
                g1.FillRectangle(Brushes.White, 0, 0, fullImage.Width, fullImage.Height);
                g1.DrawImage(barCodeBmp, DPI * SPACE_LEFT, DPI * SPACE_UP_DOWN);
            }
 
            return fullImage;
            //return barCodeBmp;
        }
 
        static internal void SaveBarCodeToFile(string path, string barCodeNum) {
            Bitmap bmp = DrawEAN13(barCodeNum);
            bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
            bmp.Dispose();
        }
 
        static internal bool CheckControlNumber(string barCodeNum) {
            int oddSum = 0;
 
            for (int i = 0; i < barCodeNum.Length - 1; i += 2) {
                oddSum += int.Parse(barCodeNum[i].ToString());
            }
 
            oddSum *= 3;
 
            for (int i = 1; i < barCodeNum.Length - 1; i += 2) {
                oddSum += int.Parse(barCodeNum[i].ToString());
            }
 
            int last = 10 - (oddSum % 10);
 
            return (last % 10) == int.Parse(barCodeNum[barCodeNum.Length - 1].ToString());
        }
 
    }
}
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
2
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
02.08.2014, 10:36  [ТС]
Ну все, ляпота. Можно будет испытать как нибудь. Вы не знаете случайно какой шрифт используется в EAN-13 ?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 11:04
Регламентируется только высота шрифта, а не гарнитура. Похоже на гостовские, такие же зауженные, но начертание отличается. Этот похож и этот
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
02.08.2014, 12:26  [ТС]
Ну вот, первая моя программа на C# ))))
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
0
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
02.08.2014, 15:22  [ТС]
ViterAlex, вы не знаете случайно, как сделать иконку для .exe ?
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
02.08.2014, 16:23
Свойства проекта→Icon
1
4 / 4 / 2
Регистрация: 05.02.2013
Сообщений: 441
03.08.2014, 15:29  [ТС]
Спасибо за всю оказанную помощь.
0
0 / 0 / 0
Регистрация: 30.12.2014
Сообщений: 121
04.04.2021, 00:18
Цитата Сообщение от ViterAlex Посмотреть сообщение
Вот я тут наваял на досуге:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System.Drawing;
using System.Drawing.Drawing2D;
 
namespace WindowsFormsApplication1 {
    internal static class BarCode {
        const float LINE_LEN = 0.8996f;//22,85 мм
        const float SPACE_UP_DOWN = 0.013f;//0,33 мм
        const float SPACE_LEFT = 0.1429f;//3,63 мм
        const float SPACE_RIGHT = 0.0909f;//2,31 мм
        const float SEPARATOR_LINE_LEN = 0.9646f;//24,5 мм
        const float TEXT_HEIGHT = 0.1083f;//25,91 - 23,16 = 2,75 мм
        const float TEXT_POS = 0.9118f;//23,16 мм
 
        //Коды для левой шестёрки
        static uint[,] Lcode = new uint[10, 7]{
            {0,0,0,1,1,0,1},
            {0,0,1,1,0,0,1},
            {0,0,1,0,0,1,1},
            {0,1,1,1,1,0,1},
            {0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},
            {0,1,0,1,1,1,1},
            {0,1,1,1,0,1,1},
            {0,1,1,0,1,1,1},
            {0,0,0,1,0,1,1}
        };
        //Коды для правой шестёрки
        static uint[,] Rcode = new uint[10, 7]{
            {1,1,1,0,0,1,0},
            {1,1,0,0,1,1,0},
            {1,1,0,1,1,0,0},
            {1,0,0,0,0,1,0},
            {1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},
            {1,0,1,0,0,0,0},
            {1,0,0,0,1,0,0},
            {1,0,0,1,0,0,0},
            {1,1,1,0,1,0,0}
        };
        //Коды разделителей
        static uint[,] Divcode = new uint[3, 5] {
            {1,0,1,2,2},
            {0,1,0,1,0},
            {1,0,1,2,2}
        };
        static Pen pen = new Pen(Color.White, 4.64f) { Alignment = PenAlignment.Right };
        static internal Bitmap DrawEAN13(string barCodeNum) {
 
            Bitmap barCodeBmp = new Bitmap(441, 307);
            barCodeBmp.SetResolution(300f, 300f);
 
            float res = barCodeBmp.HorizontalResolution;
 
            int w = (int)(barCodeBmp.Width + res * (SPACE_LEFT + SPACE_RIGHT)), h = (int)(barCodeBmp.Height + 2 * res * SPACE_UP_DOWN);
            Bitmap fullImage = new Bitmap(w, h);
            fullImage.SetResolution(res, res);
 
            float textSpace = 7 * pen.Width / 6;
            PointF textPt = new PointF(0, TEXT_POS * res);//координаты текста
            Font f = new Font("Courier", TEXT_HEIGHT * 72, FontStyle.Regular);
 
            using (Graphics g = Graphics.FromImage(barCodeBmp),
                            g1 = Graphics.FromImage(fullImage)) {
                g.FillRectangle(Brushes.White, new Rectangle(0, 0, 441, 307));
 
                //Ограничитель слева
                float x = 0f, y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[0, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Левая половина кода
                int n;
                y = LINE_LEN * res;
                for (int i = 0; i < 6; i++, textPt.X += textSpace) {
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    n = int.Parse(barCodeNum[i].ToString());
                    for (int j = 0; j < Lcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
 
                //Ограничитель по центру
                y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < Divcode.GetLength(1); i++, x += pen.Width) {
                    pen.Color = Divcode[1, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
 
                //Правая половина кода
                y = LINE_LEN * res;
                for (int i = 6; i < barCodeNum.Length; i++, textPt.X += textSpace) {
                    n = int.Parse(barCodeNum[i].ToString());
                    textPt.X = x;
                    g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                    for (int j = 0; j < Rcode.GetLength(1); j++, x += pen.Width) {
                        pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                }
                //Ограничитель справа
                y = SEPARATOR_LINE_LEN * res;
                for (int i = 0; i < 3; i++, x += pen.Width) {
                    pen.Color = Divcode[2, i] == 0 ? Color.White : Color.Black;
                    g.DrawLine(pen, x, 0, x, y);
                }
                g1.FillRectangle(Brushes.White, 0, 0, fullImage.Width, fullImage.Height);
                g1.DrawImage(barCodeBmp, res * SPACE_LEFT, res * SPACE_UP_DOWN);
            }
            return fullImage;
        }
        static internal void SaveBarCodeToFile(string path, string barCodeNum) {
            Bitmap bmp = DrawEAN13(barCodeNum);
            bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
            bmp.Dispose();
        }
 
    }
}

Здесь нет отступов от разделителей до кода
Не подскажите, пожалуйста, как запустить данный код на проверку?
Никак не идёт создать проект, чтобы увидеть алгоритм в действии.
Работаю над проектом, в котором при нажатии на кнопку и ввода кода - создаётся штрих-код, который можно напечатать. Нашёл много алгоритмов, но что-то они никак совершенно не идут.
Заранее буду искренне благодарен за помощь.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
04.04.2021, 01:17
Труляля, нужно а) вызывать метод BarCode.DrawEAN13 который вернет Bitmap который можно вывести на PictureBox
или б) вызвать метод BarCode.SaveBarCodeToFile чтобы сразу сохранить рисунок в файл.

Обо всем этом можно было догадаться самому просто посмотрев на код, а точнее на доступные методы.
1
0 / 0 / 0
Регистрация: 30.12.2014
Сообщений: 121
04.04.2021, 09:37
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Труляля, нужно а) вызывать метод BarCode.DrawEAN13 который вернет Bitmap который можно вывести на PictureBox
или б) вызвать метод BarCode.SaveBarCodeToFile чтобы сразу сохранить рисунок в файл.

Обо всем этом можно было догадаться самому просто посмотрев на код, а точнее на доступные методы.
Хорошо, а как это связать с формой, в которой можно ввести код для генерации штрих-кода и его изображении в picturebox на этой же форме?
Я извиняюсь, если спрашиваю очевидные вещи, просто не такой опытный эксперт в программировании.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
04.04.2021, 09:42
Цитата Сообщение от Труляля Посмотреть сообщение
а как это связать с формой, в которой можно ввести код для генерации штрих-кода и его изображении в picturebox на этой же форме?
Элементарно. В том месте где нужно вывести изображение, например в обработчике кнопки пишем строку вида
C#
1
pictureBoxBarCode.Image = BarCode.DrawEAN13(textBoxEAN13.Text);
1
0 / 0 / 0
Регистрация: 30.12.2014
Сообщений: 121
04.04.2021, 10:15
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Элементарно. В том месте где нужно вывести изображение, например в обработчике кнопки пишем строку вида
C#
1
pictureBoxBarCode.Image = BarCode.DrawEAN13(textBoxEAN13.Text);
Как я понял. Но, видимо, что-то не так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
 
namespace Shop
{
    public partial class PricePrintForm : Form
    {
        public PricePrintForm()
        {
            InitializeComponent();
        }
        internal static class BarCode
        {
            const float LINE_LEN = 0.8996f;//22,85 мм
            const float SPACE_UP_DOWN = 0.013f;//0,33 мм
            const float SPACE_LEFT = 0.1429f;//3,63 мм
            const float SPACE_RIGHT = 0.0909f;//2,31 мм
            const float SEPARATOR_LINE_LEN = 0.9646f;//24,5 мм
            const float TEXT_HEIGHT = 0.1083f;//25,91 - 23,16 = 2,75 мм
            const float TEXT_POS = 0.9118f;//23,16 мм
 
            //Коды для левой шестёрки
            static uint[,] Lcode = new uint[10, 7]{
            {0,0,0,1,1,0,1},
            {0,0,1,1,0,0,1},
            {0,0,1,0,0,1,1},
            {0,1,1,1,1,0,1},
            {0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},
            {0,1,0,1,1,1,1},
            {0,1,1,1,0,1,1},
            {0,1,1,0,1,1,1},
            {0,0,0,1,0,1,1}
        };
            //Коды для правой шестёрки
            static uint[,] Rcode = new uint[10, 7]{
            {1,1,1,0,0,1,0},
            {1,1,0,0,1,1,0},
            {1,1,0,1,1,0,0},
            {1,0,0,0,0,1,0},
            {1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},
            {1,0,1,0,0,0,0},
            {1,0,0,0,1,0,0},
            {1,0,0,1,0,0,0},
            {1,1,1,0,1,0,0}
        };
            //Коды разделителей
            static uint[,] Divcode = new uint[3, 5] {
            {1,0,1,2,2},
            {0,1,0,1,0},
            {1,0,1,2,2}
        };
            static Pen pen = new Pen(Color.White, 4.64f) { Alignment = PenAlignment.Right };
            static internal Bitmap DrawEAN13(string barCodeNum)
            {
 
                Bitmap barCodeBmp = new Bitmap(441, 307);
                barCodeBmp.SetResolution(300f, 300f);
 
                float res = barCodeBmp.HorizontalResolution;
 
                int w = (int)(barCodeBmp.Width + res * (SPACE_LEFT + SPACE_RIGHT)), h = (int)(barCodeBmp.Height + 2 * res * SPACE_UP_DOWN);
                Bitmap fullImage = new Bitmap(w, h);
                fullImage.SetResolution(res, res);
 
                float textSpace = 7 * pen.Width / 6;
                PointF textPt = new PointF(0, TEXT_POS * res);//координаты текста
                Font f = new Font("Courier", TEXT_HEIGHT * 72, FontStyle.Regular);
 
                using (Graphics g = Graphics.FromImage(barCodeBmp),
                                g1 = Graphics.FromImage(fullImage))
                {
                    g.FillRectangle(Brushes.White, new Rectangle(0, 0, 441, 307));
 
                    //Ограничитель слева
                    float x = 0f, y = SEPARATOR_LINE_LEN * res;
                    for (int i = 0; i < 3; i++, x += pen.Width)
                    {
                        pen.Color = Divcode[0, i] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
 
                    //Левая половина кода
                    int n;
                    y = LINE_LEN * res;
                    for (int i = 0; i < 6; i++, textPt.X += textSpace)
                    {
                        textPt.X = x;
                        g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                        n = int.Parse(barCodeNum[i].ToString());
                        for (int j = 0; j < Lcode.GetLength(1); j++, x += pen.Width)
                        {
                            pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                            g.DrawLine(pen, x, 0, x, y);
                        }
                    }
 
                    //Ограничитель по центру
                    y = SEPARATOR_LINE_LEN * res;
                    for (int i = 0; i < Divcode.GetLength(1); i++, x += pen.Width)
                    {
                        pen.Color = Divcode[1, i] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
 
                    //Правая половина кода
                    y = LINE_LEN * res;
                    for (int i = 6; i < barCodeNum.Length; i++, textPt.X += textSpace)
                    {
                        n = int.Parse(barCodeNum[i].ToString());
                        textPt.X = x;
                        g.DrawString(barCodeNum[i].ToString(), f, Brushes.Black, textPt);
                        for (int j = 0; j < Rcode.GetLength(1); j++, x += pen.Width)
                        {
                            pen.Color = Lcode[n, j] == 0 ? Color.White : Color.Black;
                            g.DrawLine(pen, x, 0, x, y);
                        }
                    }
                    //Ограничитель справа
                    y = SEPARATOR_LINE_LEN * res;
                    for (int i = 0; i < 3; i++, x += pen.Width)
                    {
                        pen.Color = Divcode[2, i] == 0 ? Color.White : Color.Black;
                        g.DrawLine(pen, x, 0, x, y);
                    }
                    g1.FillRectangle(Brushes.White, 0, 0, fullImage.Width, fullImage.Height);
                    g1.DrawImage(barCodeBmp, res * SPACE_LEFT, res * SPACE_UP_DOWN);
                }
                return fullImage;
            }
            static internal void SaveBarCodeToFile(string path, string barCodeNum)
            {
                Bitmap bmp = DrawEAN13(barCodeNum);
                bmp.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
                bmp.Dispose();
            }
        }
 
        private void pictureBoxBarCode_Layout(object sender, LayoutEventArgs e)
        {
            pictureBoxBarCode.Image = BarCode.DrawEAN13(textBoxEAN13.Text);
        }
 
        private void textBoxEAN13_TextChanged(object sender, EventArgs e)
        {
            BarCode.DrawEAN13(string barCodeNum);
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap DrawEAN13(string barCodeNum);
        }
    }
}
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2021, 10:15
Помогаю со студенческими работами здесь

Реализация алгоритма ГОСТ Р 34.10-94
Есть ли у кого-нибудь исходник программы, реализующую данный алгоритм?

Алгоритмы для распознавания штрих-кода (бар-кода)
Дорогие друзья, нужны любые алгоритмы, о которых вы слышали и при помощи которых распознаются штрих-коды. Причем штрих-код может быть под...

Реализация шифрования по ГОСТ 28147-89
Добрый день. Возникла необходимость реализовать данный алгоритм шифрования. Изучил труды Винокурова и сам ГОСТ. Не могу отладить код......

Реализация шифра ГОСТ 28147-89
Всем привет. Вот решил загнаться комбинированной системой шифрования с шифрами ГОСТ 28147-89 и RSA. Пока засел на ГОСТе. Сам алгоритм я...

CUDA реализация гост 34.12(Кузнечик)
Всем привет! Пытаюсь реализовать алгоритм шифрования Кузнечик с использованием основе технологии CUDA, столкнулся с проблемой медленного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru