[VB6] Utilisation de la DLL: HaruPDF. [chargement image]

Résolu
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 - Modifié le 26 sept. 2019 à 14:54
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 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.

1 réponse

JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
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.
0
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
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"...
0
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
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

0
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
28 sept. 2019 à 03:31
Sources et DLL: http://dl.free.fr/kidXY2AGe
(téléchargement sur CCM impossible)
0
JeuDuTaquin Messages postés 249 Date d'inscription mardi 4 juillet 2017 Statut Membre Dernière intervention 31 mai 2023 7
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/
...
0
Rejoignez-nous