Рассчитать размер изображения, необходимый для хранения графического объекта - PullRequest
1 голос
/ 13 мая 2009

Я пишу приложение для работы со штрих-кодом, где я создаю графический объект и рисую различные полосы для штрих-кода с кодом 39. Я создаю графический объект со следующим кодом:

int reqBarcodeWidth = 100;
int reqBarcodeHeight = 40;

objBitmap = new Bitmap(reqBarcodeWidth, reqBarcodeHeight);

objGraphics = Graphics.FromImage(objBitmap);

Однако я хочу разрешить использование различных единиц для рисования на графическом объекте, например:

objGraphics.PageUnit = GraphicsUnit.Inch;

Однако, если я сделаю это, как я узнаю, какой размер растрового изображения создать, чтобы разместить на нем полный штрих-код?

Заранее спасибо за любую помощь.

Обновление:

Спасибо за ответ. Ранее я уже рассматривал шрифты со штрих-кодом и очень хочу покончить с установкой шрифтов на многих компьютерах.

Также одной из функций программы, о которой я не упомянул, будет печать кодов акций для склада, с которыми не связаны коды EAN. Обычно это товары из Китая со сложными биржевыми кодами. Для этого потребуется использовать штрих-код Code 128, который использует расширенный диапазон символов, а также занимает меньше места.

Тяжёлый бит в основном делается только для создания образа, который мне нужно разобраться. Я не знаю, пытаюсь ли я сделать это сложным способом, на самом деле раньше я ничего не делал с изображениями.

Ответы [ 2 ]

2 голосов
/ 28 мая 2009

Однако, если я сделаю это, как мне узнать, какой размер растрового изображения создать, чтобы уместить на нем полный штрих-код?

Растровые изображения основаны на физических устройствах, которые имеют определенные разрешения, обычно измеряемые в DPI (точек на дюйм). ОС Windows использует для монитора логическое разрешение 96 или 120 т / д. Принтеры имеют физическое разрешение от 300 до 600, а иногда до 1200 и более. Фотоприемники, обрабатывающие пленку, могут иметь физическое разрешение до 2540 и более точек на дюйм.

Логическое разрешение подразумевает, что X точек равны одному дюйму на определенном устройстве. Обычно это приближение и может быть использовано для масштабирования. Физическое разрешение указывает, что устройство может реализовать (или физически присутствует) число X точек на дюйм.

При создании штрих-кодов и печати на устройстве вы должны учитывать разрешение этого устройства. Если у вас есть штрих-код шириной 4 дюйма и вы хотите напечатать его на принтере с разрешением 600 точек на дюйм, вам потребуется растровое изображение шириной 4 * 600 = 2400 пикселей. Существуют и другие последствия для печати на определенных устройствах, так что вы не можете непреднамеренно уменьшить / увеличить полосы кода.

Смысл всего моего бессвязного в том, что вы должны сгенерировать свои штрих-коды, используя векторный формат, например .WMF или .EMF, и затем отобразить их в растровом изображении, предназначенном для устройства, на которое вы хотите выводить. Это также позволит вам редактировать коды в программе для векторного рисования, такой как CorelDRAW или Adobe Illustrator.

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

Обладая этим знанием, вы можете создавать штрих-коды, используя нечто похожее на следующее (скопируйте и вставьте этот код vb.net в событие form.load или нажатия кнопки в новом проекте):


Dim gfx As Graphics = Me.CreateGraphics
Dim hdc As IntPtr = gfx.GetHdc()
Dim mf As System.Drawing.Imaging.Metafile = New Imaging.Metafile("c:\1.wmf", hdc, New RectangleF(0, 0, 5 * 2540, 1 * 2540), Imaging.MetafileFrameUnit.GdiCompatible)
Dim g As Graphics = Graphics.FromImage(mf)
g.PageUnit = GraphicsUnit.Inch

g.FillRectangle(Brushes.Blue, New RectangleF(0, 0, 5, 1))
g.FillRectangle(Brushes.Red, New RectangleF(0.25, 0.25, 4.5, 0.5))

g.Dispose()
mf.Dispose()
gfx.ReleaseHdc(hdc)
gfx.Dispose()
  • Размер в конструкторе метафайла - дюймы * 2540. 2540 - это константа, представляющая 0,01 миллиметра на дюйм. Это то, что использует базовый GDI.

Теперь откройте файл «1.wmf» с помощью real векторной графической программы, такой как CorelDRAW или Illustrator. (Вы не можете использовать MSPaint или Windows Preview и т. Д.). Вы заметите, что у вас есть синий прямоугольник 5x1 с красным прямоугольником 4,5 x 0,5, центрированным внутри.

Вот как ваши штрих-коды должны быть нарисованы в метафайле . Замените код синего и красного прямоугольника вашей процедурой рисования штрих-кода. Не забудьте создать прозрачную рамку размеров, чтобы сообщить метафайлу границы вашего чертежа.


g.FillRectangle(Brushes.Transparent, rectBounds)

После того как ваш штрих-код нарисован и сохранен в метафайле, вы можете загрузить его с помощью GDI + и отобразить его в растровом изображении с разрешением вашего устройства вывода. Очевидно, что последний шаг - отправка растрового изображения на ваше устройство вывода, если, конечно, ваше устройство вывода не имеет встроенного векторного или постскриптного процессора.

Ну, это было, вероятно, больше, чем вы когда-либо хотели знать о теме, но это правильный способ сделать это, и это сэкономит вам огромное количество времени и душевных страданий, если ваши коды когда-либо быть обвиненным в том, что он "не может быть сканирован" ...

Удачи, и дайте мне знать, как это получается.

2 голосов
/ 13 мая 2009

Знаете ли вы, что существуют шрифты, которые рисуют штрих-код, поэтому вы можете избежать всего этого беспорядка ???

...