FAQ TBarCode DLL / TBarCode Library
Comment dessiner le code-barres avec un DPI différent sur les axes X et Y ?
Comment dessiner le code-barres avec un DPI différent sur les axes X et Y ?
La bibliothèque de génération de codes-barres ne prend pas en charge l'export bitmap avec une résolution anisotrope (DPI Y != DPI X). Chaque fois que nous devons créer notre propre DC, nous le créons « isotrope » (DPI Y = DPI X). Mais il existe des solutions de contournement présentées ci-dessous.
Solutions de contournement :
Exemple - vous avez besoin de DPI X = 1200, DPI Y = 600
A) Contexte de périphérique anisotrope
- Utilisez BCDraw (hDC) avec un contexte de périphérique où DPI X = 1200 et DPI Y = 600 sont déjà préréglés sur ces valeurs.
- Utilisez Draw(gfx) avec un objet graphique, où le DC interne est préréglé sur DPI X = 1200 et DPI Y = 600.
- N'appelez pas BCSetDPI, ou utilisez BCSetDPI (pBarcode, -1, -1) ➔ réinitialise le DPI de la bibliothèque aux valeurs par défaut du DC.
- Ne définissez pas BCIgnoreDPIFromDC, car nous avons besoin des valeurs du DC ou de l'objet graphique.
- Si vous avez besoin de l'image du code-barres dans un fichier bitmap, vous devez la créer avec votre propre code à partir de l'image dessinée en mémoire.
B) Mettre l'image à l'échelle
Bibliothèque C/C++
Dessinez d'abord sur un DC bitmap à 1200 x 1200 dpi (isotrope), puis mettez l'image à l'échelle de 50 % sur l'axe Y = 600 dpi pour obtenir votre résultat anisotrope.
- Vous pouvez utiliser le code de la FAQ Dessin sur un DC bitmap et mise à l'échelle vers un DC écran comme base.
- Lors de la copie de l'image, utilisez StretchBlt plutôt que BitBlt pour obtenir la mise à l'échelle de l'axe Y (utilisez un ROP et un mode d'étirement qui ne crée pas d'aliasing ou de contours adoucis)
- 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 - Laissez TBarCode dessiner en haute résolution même sur un DC écran à faible résolution :
Si votre DC bitmap est basé sur la résolution d'écran (~ 96 dpi), mais que vous souhaitez 1200 dpi ou autre, vous pouvez utiliser la fonction API BCSetIgnoreDPIFromDC (pBarcode, TRUE) - à définir avant BCDraw - en combinaison avec BCSetDPI (pBarCode, 1200, 1200). Cela permet de dessiner un bitmap haute résolution en mettant à l'échelle en interne les coordonnées de dessin du code-barres. Notez que le DPI X et le DPI Y doivent être égaux ici, le DC bitmap cible doit être suffisamment grand pour contenir l'image complète (attention à la largeur/hauteur). Le même principe fonctionne aussi en .NET avec des fonctions API similaires.
Si vous avez besoin d'un fichier BMP/JPG/PNG à partir de votre image en mémoire, vous devez utiliser du code d'export bitmap supplémentaire (bibliothèques gratuites et exemples de code disponibles publiquement sur le web).
API .NET
Si vous utilisez notre API .NET, vous pouvez faire quelque chose de similaire à StretchBlt (GDI) avec la fonction DrawImage(). Créez d'abord un bitmap de code-barres « normal », puis étirez-le ou modifiez le DPI – voir l'exemple de code (ou cherchez sur Google pour en savoir plus) :
C) Dessin personnalisé
Utilisez notre mécanisme de dessin Callback. Vous obtenez toutes les coordonnées – soit en millimètres, soit sous forme de motif matriciel (motif de lignes). Vous décidez ensuite vous-même comment mettre à l'échelle les coordonnées des axes X et Y reçues de la bibliothèque. Vous recevez les coordonnées avec une résolution de 1/1000 mm depuis la bibliothèque et pouvez les convertir en pixels avec votre propre code (en appliquant votre propre DPI aux axes X et Y). Dessinez ensuite sur un DC bitmap (rectangle rempli GDI) ou utilisez une bibliothèque graphique qui fait le travail pour vous (par ex. .NET).
Exemple de code pour le dessin personnalisé (installé avec le SDK) :
C:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual C++\Custom DrawingC:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual Studio .NET\CustomDrawing
Plus de détails :
- TBarCode11 DLL Developer Manual - section « Custom Drawing »
- TBarCode Library Customized Drawing (Callbacks)
Le dessin par Callback est disponible dans la DLL native C/C++ ainsi que dans l'API .NET (voir l'exemple ci-dessus).