Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
1

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

01.08.2014, 11:11. Просмотров 815. Ответов 14
Метки нет (Все метки)

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

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

Я не понимаю как это правильно реализовать, чтобы при печати размеры совпадали с ГОСТ ? Всё должно быть как можно проще, т.е. сгенерировал jpeg, запихал в буфер обмена и вставил куда надо без лишней подгонки и т.д.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2014, 11:11
Ответы с готовыми решениями:

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

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

Реализация алгоритма шифрования по ГОСТ 28147-89
Добрый день! Пытаюсь реализовать все тот же алгоритм шифрования ГОСТ-89. Уже целую неделю долблюсь,...

USB сканер штрих-кода
Всем доброго времени суток , у меня сложилась следующая ситуация. Имеется сканер штрих-кода...

Работа с HID сканером штрих-кода
Всем доброго времени суток! Может кто нибудь подсказать адекватную библиотеку для работы с USB....

14
XRoy
862 / 712 / 305
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
01.08.2014, 11:34 2
Abraziv__,
Посмотрите на Barcode .NET Control
0
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
01.08.2014, 14:08  [ТС] 3
Спасибо, но что то не помогло ((((( Сам алгоритм реализовать не сложно, уже практически реализовал, осталось нарисовать ))))
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 05:50 4
Цитата Сообщение от 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
02.08.2014, 05:50
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
02.08.2014, 05:54  [ТС] 5
Спасибо, я примерно так и делаю. Только размер изображения меньше получается.
Не подскажите есть ли функция, для забеливания объекта Bitmap? А то рисуется на picturebox нормально, а сохраняю чёрный весь рисунок.
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 07:16 6
Вот я тут наваял на досуге:
Кликните здесь для просмотра всего текста
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
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
02.08.2014, 08:12  [ТС] 7
Добрый день. Спасибо за код.
Мне кажется у вас не правильно работает и контрольную сумму тоже не высчитывает. Я проверял на различных кодах, мой вроде похож.
Вот, что у меня получилось с тем же кодом:
0
Изображения
 
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 08:54 8
Согласен, может и накосячил где. После работы внимание уже не то. А про контрольную сумму я и не думал. Вбил цифры от фонаря
Увидел, где накосячил. В цикле для правой части нужно Lcode заменить на Rcode. Копипаст — это зло
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 10:29 9
Ну вроде подправил. Мой телефон код смог прочитать, правда только если контрольная сумма совпадает.
Кликните здесь для просмотра всего текста
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());
        }
 
    }
}
0
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
02.08.2014, 10:36  [ТС] 10
Ну все, ляпота. Можно будет испытать как нибудь. Вы не знаете случайно какой шрифт используется в EAN-13 ?
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 11:04 11
Регламентируется только высота шрифта, а не гарнитура. Похоже на гостовские, такие же зауженные, но начертание отличается. Этот похож и этот
0
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
02.08.2014, 12:26  [ТС] 12
Ну вот, первая моя программа на C# ))))
0
Миниатюры
Реализация штрих-кода в picturebox по ГОСТ  
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
02.08.2014, 15:22  [ТС] 13
ViterAlex, вы не знаете случайно, как сделать иконку для .exe ?
0
ViterAlex
6932 / 3875 / 1571
Регистрация: 11.02.2013
Сообщений: 8,443
Завершенные тесты: 3
02.08.2014, 16:23 14
Свойства проекта→Icon
1
Abraziv__
3 / 3 / 2
Регистрация: 05.02.2013
Сообщений: 411
03.08.2014, 15:29  [ТС] 15
Спасибо за всю оказанную помощь.
0
03.08.2014, 15:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2014, 15:29

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru