JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 2023
-
Modifié le 26 sept. 2019 à 14:54
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 2023
-
2 oct. 2019 à 16:41
Salut à tous,
Je me suis penché sur l'exemple de la DLL de la librairie libharu.org sur VB6.
La création de PDF semble fonctionner.
Mais mon but est d'exporter le contenu d'une PictureBox vers un PDF.
J'ai donc repris le code de démonstration, et j'y ai incus les fonctionalitées graphiques inclues dans les demos en C.
Et tout fonctionne.
Malheureusement, si les échantillonnages RVB fonctionnent pour des icônes en 32x32, toutes autres dimensions d'images semblent ne pas fonctionner.
J'utilise la fonction dans cette routine:
'Get picture's Width and Height
bmWidth = Picture1.Width
bmHeight = Picture1.height
'ReDefine Bit array to hold all pixels from picture box
' ReDim Bits(0 To 2, 0 To bmWidth - 1, 0 To bmHeight - 1, 0) As Byte
ReDim Bits((bmWidth * bmHeight * 4) - 1) As Byte
ReDim Bitstmp((bmWidth * bmHeight * 3) - 1) As Byte
'Store size of bitmap in total pixels
bmSize = bmWidth * bmHeight * 4
'Grab picture's pixels and load to Bit array
GetBitmapBits Picture1.image, bmSize, Bits(0)
Dim a
a = 0
For Cnt = 0 To (bmSize - 1) Step 4
CopyMemory Bitstmp(a), Bits(Cnt), 3
a = a + 3
Next
Dim hf As Integer
hf = FreeFile
Open "picture2.dat" For Binary As hf
Put hf, 1, Bitstmp
Close hf
image = HPDF_LoadRawImageFromFile(pdf, "picture2.dat", bmWidth, bmHeight, HPDF_CS_DEVICE_RGB)
x = 200: y = 300
Call HPDF_Page_DrawImage(page, image, x, y, bmWidth, bmHeight)
La DLL utilise "RGBRGBRGB" de manière linéaire, et "GetBitmapBits" donne du "RGBuRGBuRGBu".
Donc, je linéarise le fichier d'entrée en coupant les données "RGB".
La DLL est très capricieuse, et plante l'IDE en cas de problème de taille...
Mais, je n'arrive pas à afficher une image sans un décalage de plusieurs pixels de ligne en ligne.
Ma question:
La structure "GetBitmapBits" est elle un suite de pixels en "RGBx" (lignes après lignes) ou utilise-elle des informations de structure compatible avec un DIM Bits(0 to 2, 0 to Xmax,0 to Ymax)?
Nota: Je suppose qu'il y a un problème de largeur, qui probablement doit être un multiple de 8 pixels…
Sinon, il faut passer par un fichier "JPG" en temporaire, et utiliser une autre DLL…
J'ai pas cherché sur le net.
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 20237 26 sept. 2019 à 19:55
Salut,
Merci à Hervé_be, qui sans le vouloir a inspiré la correction de mon erreur !
La variable de dissection de l'image était incorrecte.
Donc, le bon code est :
Private Sub Hpdf_PaintPicture(pdf As Long, page As Long, myPictureBox As PictureBox, Locx as long, Locy as long)
'Static bitstmp() As Byte
Dim image As Long
'Get picture's Width and Height
bmWidth = myPictureBox.ScaleWidth
bmHeight = myPictureBox.ScaleHeight
'ReDefine Bit array to hold all pixels from picture box
ReDim Bits(0 To 3, 0 To bmWidth - 1, 0 To bmHeight - 1) As Byte
'Store size of bitmap in total pixels
bmSize = bmWidth * bmHeight
'Grab picture's pixels and load to Bit array
GetBitmapBits myPictureBox.image, bmSize * 4, Bits(0, 0, 0)
ReDim bitstmp((bmSize * 3) - 1) As Byte
a = 0
For y = 0 To bmHeight - 1
For x = 0 To bmWidth - 1
bitstmp(a) = Bits(2, x, y)
bitstmp(a + 1) = Bits(0, x, y)
bitstmp(a + 2) = Bits(1, x, y)
a = a + 3
Next
Next
image = HPDF_LoadRawImageFromMem(pdf, bitstmp(0), bmWidth, bmHeight, HPDF_CS_DEVICE_RGB, 8)
'HPDF_CS_DEVICE_RGB
Call HPDF_Page_DrawImage(page, image, Locx, Locy, bmWidth, bmHeight)
End Sub
Amusez-vous bien.
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 20237 Modifié le 26 sept. 2019 à 20:28
Salut,
Le dépôts de codes sources est impossible (new.json) ne passe pas sur EI.
Donc, impossible de partager le programme…
Copiez ce code dans la démo VB6 inclue dans "if/vb6" de la librairie, cela devrai marcher avec la librairie DLL "libHaru.dll"...
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 20237 28 sept. 2019 à 02:59
Correctif:
a = 0
For y = 0 To bmHeight - 1
For x = 0 To bmWidth - 1
bitstmp(a) = Bits(2, x, y)
bitstmp(a + 1) = Bits(1, x, y)
bitstmp(a + 2) = Bits(0, x, y)
a = a + 3
Next
Next
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 20237 28 sept. 2019 à 03:31
JeuDuTaquin
Messages postés250Date d'inscriptionmardi 4 juillet 2017StatutMembreDernière intervention23 mai 20237 Modifié le 2 oct. 2019 à 16:45
Salut,
Pour info, l'utilisation d'une DLL en répertoire d'application, peut poser problème en cas de changement de répertoire "actif" (CurDir).
En cas de ChDir (changement de répertoire actif), la DLL ne sera pas trouvée!
Nous avons deux solutions:
-1 Enregistrer et exporter la DLL dans un répertoire système.
-2 Créer une class indépendante:
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "PrintInPDF"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Pour rendre disponible les fonctions et sub disponibles en 'Public'
Puis :
Private Cpath As String
Private Sub Class_Initialize()
Cpath = CurDir
ChDir (App.path)
End Sub
Private Sub Class_Terminate()
ChDir (Cpath)
End Sub
Cela évite qu'il perde son chemin, des déclarations dans le programme principale et cela permet d'isoler les codes sur des DLLs utilisateur.
Par contre, sur cette class, on a un Handel sur le fichier PDF, donc il faudra rendre 'public' les variables de travail (PDF,PAGE,IMAGE...).
Mais j'avoue ne pas avoir poussé le vis à faire des allez-et-retours pour ouvrir un Handel, modifier et clôturer le tread.
Le test s'est porté sur une création/clôture sur une seule cession de classe.
Donc, cela peut poser problème. /à voir/
...
Modifié le 26 sept. 2019 à 20:28
Le dépôts de codes sources est impossible (new.json) ne passe pas sur EI.
Donc, impossible de partager le programme…
Copiez ce code dans la démo VB6 inclue dans "if/vb6" de la librairie, cela devrai marcher avec la librairie DLL "libHaru.dll"...
28 sept. 2019 à 02:59
28 sept. 2019 à 03:31
(téléchargement sur CCM impossible)
Modifié le 2 oct. 2019 à 16:45
Pour info, l'utilisation d'une DLL en répertoire d'application, peut poser problème en cas de changement de répertoire "actif" (CurDir).
En cas de ChDir (changement de répertoire actif), la DLL ne sera pas trouvée!
Nous avons deux solutions:
-1 Enregistrer et exporter la DLL dans un répertoire système.
-2 Créer une class indépendante:
Pour rendre disponible les fonctions et sub disponibles en 'Public'
Puis :
Cela évite qu'il perde son chemin, des déclarations dans le programme principale et cela permet d'isoler les codes sur des DLLs utilisateur.
Par contre, sur cette class, on a un Handel sur le fichier PDF, donc il faudra rendre 'public' les variables de travail (PDF,PAGE,IMAGE...).
Mais j'avoue ne pas avoir poussé le vis à faire des allez-et-retours pour ouvrir un Handel, modifier et clôturer le tread.
Le test s'est porté sur une création/clôture sur une seule cession de classe.
Donc, cela peut poser problème. /à voir/
...