Часто задаваемые вопросы: TBarCode DLL / TBarCode Library
Как отрисовать штрихкод с разным DPI по осям X и Y?
Как отрисовать штрихкод с разным DPI по осям X и Y?
Библиотека генератора штрихкодов не поддерживает экспорт растрового изображения с анизотропным разрешением (DPI Y != DPI X). Всякий раз, когда нам нужно создать собственный DC, мы создаём его «изотропным» (DPI Y = DPI X). Но есть обходные пути, показанные ниже.
Обходные пути:
Пример - вам нужно DPI X = 1200, DPI Y = 600
A) Анизотропный контекст устройства
- Используйте BCDraw (hDC) с контекстом устройства, в котором уже заранее установлены значения DPI X = 1200 и DPI Y = 600.
- Используйте Draw(gfx) с объектом графики, у которого внутренний DC заранее установлен на DPI X = 1200 и DPI Y = 600.
- Либо не вызывайте BCSetDPI, либо используйте BCSetDPI (pBarcode, -1, -1) ➔ сбрасывает DPI библиотеки к значениям по умолчанию DC.
- Не устанавливайте BCIgnoreDPIFromDC, потому что нам нужны значения из DC или объекта графики.
- Если вам нужно изображение штрихкода в файле растрового изображения, вам нужно создать его собственным кодом из нарисованного изображения в памяти.
B) Масштабирование изображения
Библиотека C/C++
Сначала отрисуйте в Bitmap DC с разрешением 1200 x 1200 dpi (изотропный), а затем масштабируйте изображение по оси Y до 50% = 600 dpi, чтобы получить анизотропный результат.
- Вы можете использовать в качестве основы код из FAQ Отрисовка в Bitmap-DC и масштабирование в Screen-DC.
- При копировании изображения используйте StretchBlt вместо BitBlt для масштабирования по оси Y (используйте ROP и Stretch Mode, которые не создают сглаживания или размытых краёв)
- https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchblt
- https://learn.microsoft.com/en-us/windows/win32/gdi/scaling-an-image - Пусть TBarCode рисует с высоким разрешением даже на низкоразрешающем экранном DC:
Если ваш Bitmap DC основан на разрешении экрана (~ 96 dpi), но вам нужно 1200 dpi или что-то ещё, вы можете использовать функцию API BCSetIgnoreDPIFromDC (pBarcode, TRUE) - установите её перед BCDraw - в сочетании с BCSetDPI (pBarCode, 1200, 1200). Это создаёт растровое изображение высокого разрешения путём внутреннего масштабирования координат отрисовки штрихкода. Обратите внимание, что DPI X и DPI Y здесь должны быть равны, а целевой Bitmap DC должен быть достаточно большим, чтобы вместить полное изображение (учитывайте ширину/высоту). То же самое работает и в .NET с аналогичными функциями API.
Если вам нужен файл BMP/JPG/PNG из вашего изображения в памяти, вам нужно использовать дополнительный код экспорта растрового изображения (бесплатные библиотеки и примеры кода общедоступны в интернете).
.NET API
Если вы используете наш .NET API, вы можете сделать что-то похожее на StretchBlt (GDI) с помощью функции DrawImage(). Сначала создайте «обычное» растровое изображение штрихкода, а затем растяните его или измените DPI – см. пример кода (или поищите в Google больше информации):
C) Пользовательская отрисовка
Используйте наш механизм отрисовки Callback. Вы получаете все координаты - либо в миллиметрах, либо в виде матричного шаблона (шаблон строк). Затем вы сами решаете, как масштабировать координаты по осям X и Y, полученные из библиотеки. Вы получаете координаты с разрешением 1/1000 мм из библиотеки и можете преобразовать их в пиксели собственным кодом (применяя собственный DPI к осям X и Y). Затем рисуйте в Bitmap DC (GDI Filled Rectangle) или используйте графическую библиотеку, которая сделает эту работу за вас (например, .NET).
Пример кода для пользовательской отрисовки (устанавливается вместе с SDK):
C:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual C++\Custom DrawingC:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual Studio .NET\CustomDrawing
Подробнее:
- TBarCode11 DLL Developer Manual - раздел «Custom Drawing»
- TBarCode Library Customized Drawing (Callbacks)
Отрисовка Callback доступна как в нативной C/C++ DLL, так и в .NET API (см. пример выше).