FAQ TBarCode DLL / TBarCode Library
Come disegnare il codice a barre con DPI diversi sugli assi X e Y?
Come disegnare il codice a barre con DPI diversi sugli assi X e Y?
La libreria del generatore di codici a barre non supporta l'esportazione bitmap con risoluzione anisotropa (DPI Y != DPI X). Ogni volta che dobbiamo creare il nostro DC, lo creiamo "isotropo" (DPI Y = DPI X). Esistono tuttavia soluzioni alternative come mostrato di seguito.
Soluzioni alternative:
Esempio - avete bisogno di DPI X = 1200, DPI Y = 600
A) Device context anisotropo
- Utilizzate BCDraw (hDC) con un device context, in cui DPI X = 1200 e DPI Y = 600 sono già preimpostati su questi valori.
- Utilizzate Draw(gfx) con un oggetto grafico, in cui il DC interno è preimpostato su DPI X = 1200 e DPI Y = 600.
- Non chiamate BCSetDPI oppure usate BCSetDPI (pBarcode, -1, -1) ➔ reimposta i DPI della libreria ai valori predefiniti del DC.
- Non impostate BCIgnoreDPIFromDC perché abbiamo bisogno dei valori dal DC o dall'oggetto grafico.
- Se avete bisogno dell'immagine del codice a barre in un file bitmap, dovete crearla con codice proprio a partire dall'immagine disegnata in memoria.
B) Ridimensionare l'immagine
Libreria C/C++
Disegnate prima su un Bitmap DC a 1200 x 1200 dpi (isotropo) e poi ridimensionate l'immagine sull'asse Y al 50% = 600 dpi per ottenere il risultato anisotropo.
- Potete utilizzare come base il codice della FAQ Disegno su Bitmap-DC e ridimensionamento su Screen-DC.
- Quando copiate l'immagine, usate StretchBlt invece di BitBlt per ottenere il ridimensionamento dell'asse Y (usate un ROP e una modalità Stretch che non creino aliasing o bordi sfumati)
- 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 - Fate disegnare a TBarCode ad alta risoluzione anche su un DC schermo a bassa risoluzione:
Se il vostro Bitmap DC si basa sulla risoluzione dello schermo (~ 96 dpi), ma volete 1200 dpi o un altro valore, potete usare la funzione API BCSetIgnoreDPIFromDC (pBarcode, TRUE) - impostatela prima di BCDraw - in combinazione con BCSetDPI (pBarCode, 1200, 1200). Questo disegna una bitmap ad alta risoluzione ridimensionando internamente le coordinate di disegno del codice a barre. Da notare che DPI X e DPI Y devono essere uguali in questo caso; il Bitmap DC di destinazione deve essere abbastanza grande da contenere l'intera immagine (fate attenzione a larghezza/altezza). Lo stesso funziona anche in .NET con funzioni API simili.
Se avete bisogno di un file BMP/JPG/PNG dalla vostra immagine in memoria, dovete utilizzare codice aggiuntivo per l'esportazione bitmap (librerie gratuite e codice di esempio disponibili pubblicamente sul web).
API .NET
Se utilizzate la nostra API .NET potete fare qualcosa di simile a StretchBlt (GDI) con la funzione DrawImage(). Create prima una bitmap del codice a barre "normale" e poi ridimensionatela o cambiate i DPI - vedere il codice di esempio (o cercate su Google per altre informazioni):
C) Disegno personalizzato
Utilizzate il nostro meccanismo di disegno Callback. Ottenete tutte le coordinate, sia in millimetri sia in un pattern a matrice (pattern per riga). Poi decidete autonomamente come ridimensionare le coordinate degli assi X e Y ricevute dalla libreria. Ricevete le coordinate con risoluzione di 1/1000 mm dalla libreria e potete convertirle in pixel con codice proprio (applicando i vostri DPI agli assi X e Y). Quindi disegnate su un Bitmap DC (rettangolo pieno GDI) oppure usate una libreria grafica che svolge il lavoro per voi (ad es. .NET).
Codice di esempio per il disegno personalizzato (installato con l'SDK):
C:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual C++\Custom DrawingC:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual Studio .NET\CustomDrawing
Maggiori dettagli:
- TBarCode11 DLL Developer Manual - sezione "Custom Drawing"
- TBarCode Library Customized Drawing (Callbacks)
Il disegno Callback è disponibile nella DLL nativa C/C++ e anche nell'API .NET (vedere l'esempio sopra).