Preguntas frecuentes sobre TBarCode DLL / TBarCode Library
¿Cómo dibujar el código de barras con distinto DPI en los ejes X e Y?
¿Cómo dibujar el código de barras con distinto DPI en los ejes X e Y?
La biblioteca generadora de códigos de barras no admite la exportación de mapas de bits con resolución anisotrópica (DPI Y != DPI X). Siempre que tengamos que crear nuestro propio DC, lo creamos "isotrópico" (DPI Y = DPI X). Pero existen soluciones alternativas, como se muestra a continuación.
Soluciones alternativas:
Ejemplo: necesita DPI X = 1200, DPI Y = 600
A) Contexto de dispositivo anisotrópico
- Use BCDraw (hDC) con un contexto de dispositivo donde DPI X = 1200 y DPI Y = 600 ya estén preestablecidos con estos valores.
- Use Draw(gfx) con un objeto gráfico cuyo DC interno esté preestablecido con DPI X = 1200 y DPI Y = 600.
- No llame a BCSetDPI o use BCSetDPI (pBarcode, -1, -1) ➔ restablece el DPI de la biblioteca a los valores predeterminados del DC.
- No establezca BCIgnoreDPIFromDC, ya que necesitamos los valores del DC o del objeto gráfico.
- Si necesita la imagen del código de barras en un archivo de mapa de bits, deberá crearla con su propio código a partir de la imagen dibujada en memoria.
B) Escalar la imagen
Biblioteca C/C++
Primero dibuje en un DC de mapa de bits a 1200 x 1200 ppp (isotrópico) y después escale la imagen en el eje Y al 50% = 600 ppp para obtener su resultado anisotrópico.
- Puede usar como base el código de la FAQ Dibujar en un DC de mapa de bits y escalar a un DC de pantalla.
- Al copiar la imagen, use StretchBlt en lugar de BitBlt para lograr el escalado del eje Y (use un ROP y un modo de estiramiento que no genere aliasing ni bordes suavizados)
- 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 - Haga que TBarCode dibuje con alta resolución incluso en un DC de pantalla de baja resolución:
Si su DC de mapa de bits se basa en la resolución de pantalla (~96 ppp), pero desea 1200 ppp o algo distinto, puede usar la función de la API BCSetIgnoreDPIFromDC (pBarcode, TRUE), establecida antes de BCDraw, en combinación con BCSetDPI (pBarCode, 1200, 1200). Esto dibuja un mapa de bits de alta resolución escalando internamente las coordenadas de dibujo del código de barras. Tenga en cuenta que DPI X y DPI Y deben ser iguales aquí, y el DC de mapa de bits de destino debe ser lo bastante grande para contener la imagen completa (tenga en cuenta el ancho/alto). Lo mismo funciona también en .NET con funciones de API similares.
Si necesita un archivo BMP/JPG/PNG a partir de su imagen en memoria, deberá usar código adicional de exportación de mapa de bits (bibliotecas gratuitas y código de ejemplo disponibles públicamente en la web).
API .NET
Si usa nuestra API .NET, puede hacer algo similar a StretchBlt (GDI) con la función DrawImage(). Primero cree un mapa de bits de código de barras "normal" y después estírelo o cambie el DPI; véase el código de ejemplo (o busque en Google para más información):
C) Dibujo personalizado
Use nuestro mecanismo de dibujo por callback. Obtiene todas las coordenadas, ya sea en milímetros o en un patrón matricial (patrón de filas). Después decide usted mismo cómo escalar las coordenadas de los ejes X e Y que recibe de la biblioteca. Recibe las coordenadas con una resolución de 1/1000 mm de la biblioteca y puede convertirlas a píxeles con su propio código (aplicando su propio DPI a los ejes X e Y). Después dibuje en un DC de mapa de bits (rectángulo relleno GDI) o use una biblioteca gráfica que haga el trabajo por usted (por ejemplo, .NET).
Código de ejemplo para dibujo personalizado (instalado con el SDK):
C:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual C++\Custom DrawingC:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual Studio .NET\CustomDrawing
Más detalles:
- Manual del desarrollador de TBarCode11 DLL, sección "Custom Drawing"
- Dibujo personalizado de TBarCode Library (callbacks)
El dibujo por callback está disponible tanto en la DLL nativa C/C++ como en la API .NET (véase el ejemplo anterior).