Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Passage et renvoi paramètres dll C

3 réponses
Avatar
Suite à l'excellent tutoriel mis en ligne par Jean-Marc:
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
8-)

Je souhaite fabriquer une dll C++ pour traiter des calculs sur une image
noir et blanc.

Je gère l'image,pour la lecture/ecriture et la partie data du DIB, grâce
à la dll GFLSdk dispo sur www.xnview.com
Au travers d'un DIB pour l'affichage.

C'est à dire que j'utilise le champs data de la structure Gfl_Bitmap
déclarer dans un module public selon la spec de l'auteur de GFL:

'Structure BITMAP
Public Type GFL_BITMAP
Type As Integer
Origin As Integer
Width As Long
Height As Long
BytesPerLine As Long
LinePadding As Integer
BitsPerComponent As Integer
ComponentsPerPixel As Integer
BytesPerPixel As Integer
Xdpi As Integer
Ydpi As Integer
TransparentIndex As Integer
ColorUsed As Long
ColorMap As Long
Data As Long
Comment As Long
MetaData As Long
End Type

Le champ Data de l'image (ou du DIB) étant fournie par la dll lors de la
lecture ou par la reservation d'un espace bitmap au travers d'une
fonction équivalente à createDIBsection, de la dll GFLsdK.
Il s'agit d'un long (pointeur sur le début de la zone mémoire).
Pour le reste j'utilise la fonction (Cf code fin de post)
extGetDIBFromBitmap
Et je gère un DIB.

Ma question est la suivante:

Si je passe à une dll C++ cet entier long et la taille de la zone
mémoire réservée, puis-je dans ma dll C++ "copier" cette zone mémoire
(sans utiliser d'API, je veux rester C++ "pur").
dans une nouvelle structure.
Et puis-je Renvoyer cette structure vers VB

Type ResultDIB

Data as long 'pointeur sur la zone de données
ScanLineWidth as long
Height as long

End type

Et ensuite de faire un CopyMemory de data renvoyé vers le champ data de
la structure Gfl_Bitmap correctement prédimensionnée?

Le but du jeu étant de gérer des opérations complexe et gourmandes en
calcul (rotation d'image, gestion d'une région polygonale associée,
transformations non conformes) et ce pour des images Noir et Blanc donc
opération au niveau du bit, avec un gain de temps qui a déjà été prouvé.
:-)
J'ajoute qu'au niveau C++ mes connaissances sont uniquement littéraire,
j'ai pas encore mis en pratique, mais j'aimerais avoir une vue
d'ensemble des possibilités avant de me lancer.

Pour ceux qui s'interressent à cette question et qui souhaitent utiliser
la Sdk avec VB6, je peux leurs fournir en complément un module de classe
permettant la gestion des images et l'affichage,
qui marche avec un module de gestion des DC de PictureBox Cf post
"Ecrire le long d'une ligne" 12/08/05.

A+

Christophe

*****
Il s'agit du code original de Jérôme Quintard (contact@jeromequintard.com)
Modifier par mes soins, pour la gestion des DIB N&B et 16 couleurs et
X&Y pixelpermeter non nul

Public Function scanalign(pwidth&) As Long
scanalign = (pwidth& + 3) And &HFFFFFFFC
End Function

Public Function byteperscanline(ByVal pwidth&, ByVal bitcount&) As Long
Select Case bitcount&
Case 1
byteperscanline = scanalign((pwidth& + 7) \ 8)
Case 4
byteperscanline = scanalign((pwidth& + 1) \ 2)
Case 8
byteperscanline = scanalign(pwidth&)
Case 24
byteperscanline = scanalign(pwidth& * 3)
Case 32
'byteperscanline
End Select
End Function

Public Function extGetDIBFromBitmap(ByRef BITMAP As GFL_BITMAP) As
BITMAPINFO
Dim DIBInfo As BITMAPINFO
Dim ColorMap As GFL_COLORMAP
Dim Ind As Integer

With DIBInfo.bmiHeader
.biSize = Len(DIBInfo.bmiHeader) 'La taille de la structure
.biWidth = BITMAP.Width 'Largeur du bitmap
.biHeight = BITMAP.Height 'Hauteur du bitmap
.biPlanes = 1 'Nombre de plans
.biCompression = BI_RGB 'Toujours BI_RGB
.biClrImportant = 0 'Toujours 0

If BITMAP.Xdpi = BITMAP.Ydpi Then
If BITMAP.Xdpi <> 0 Then

.biXPelsPerMeter = CLng(BITMAP.Xdpi / 25.4 * 1000)
.biYPelsPerMeter = CLng(BITMAP.Ydpi / 25.4 * 1000)

Else
.biXPelsPerMeter = 100
.biYPelsPerMeter = 100

End If
Else
.biXPelsPerMeter = CLng(BITMAP.Xdpi / 25.4 * 1000)
.biYPelsPerMeter = CLng(BITMAP.Ydpi / 25.4 * 1000)

End If

End With

With DIBInfo
Select Case BITMAP.Type

Case 1
.bmiHeader.biBitCount = 1
.bmiHeader.biSizeImage = byteperscanline(BITMAP.Width,
1) * BITMAP.Height 'Bitmap.BytesPerLine * Bitmap.Height
.bmiHeader.biClrUsed = 2
Case 2, 4

.bmiHeader.biBitCount = 8
.bmiHeader.biSizeImage = byteperscanline(BITMAP.Width,
8) * BITMAP.Height 'GflBitmap.BytesPerLine * GflBitmap.Height
.bmiHeader.biClrUsed = 0
Case 64, 10
.bmiHeader.biBitCount = 24
.bmiHeader.biSizeImage = byteperscanline(BITMAP.Width,
24) * BITMAP.Height
.bmiHeader.biClrUsed = 0
End Select

Select Case BITMAP.Type 'Suivant le type de bitmap
Case GFL_COLORS 'Si GFL_COLORS (une palette de couleurs indexé
de 0 à 255)
extGetGflColorMapFromPtr BITMAP.ColorMap, ColorMap 'On
récupère les index du bitmap dans une structure GflColorMap
For Ind = 0 To 255 'Pour chaque index on indique à la
structure Dib_Info
.bmiColors(Ind).rgbBlue = ColorMap.Blue(Ind) 'La valeur
du bleu
.bmiColors(Ind).rgbGreen = ColorMap.Green(Ind) 'La
valeur du vert
.bmiColors(Ind).rgbRed = ColorMap.Red(Ind) 'La valeur du
rouge
Next Ind
Case GFL_BINARY 'Si GFL_BINARY (seulement noir et blanc donc 2
couleurs indexés) on indique à Dib_Info qu'il y a deux index
.bmiColors(0).rgbBlue = 0: .bmiColors(0).rgbGreen = 0:
.bmiColors(0).rgbRed = 0 'Le premier vaut Red=0,Green=0,Blue=0 donc du
noir (#000000)
.bmiColors(1).rgbBlue = 255: .bmiColors(1).rgbGreen = 255:
.bmiColors(1).rgbRed = 255 'Le second vaut Red=255,Green=255,Blue=255
donc blanc (#FFFFFF)
Case GFL_GREY 'Si GFL_GREY (On travaille sur 256 nuances)
For Ind = 0 To 255 'Pour chaque index de Dib_Info on indique
une nuance de gris
.bmiColors(Ind).rgbBlue = Ind ' Il y a 256 index et 256
gris on donne à chaque index
.bmiColors(Ind).rgbGreen = Ind ' et pour chaque canaux
la valeur de la nuance
.bmiColors(Ind).rgbRed = Ind
Next Ind
End Select
End With
extGetDIBFromBitmap = DIBInfo
End Function

3 réponses

Avatar
Jean-Marc
"<pas-despam> @Bwanadoo.fr>" <"<pas-despam> a écrit dans le message de
news:43243b6b$0$17225$

Suite à l'excellent tutoriel mis en ligne par Jean-Marc:
http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm
8-)

Je souhaite fabriquer une dll C++ pour traiter des calculs sur une image
noir et blanc.

Je gère l'image,pour la lecture/ecriture et la partie data du DIB, grâce
à la dll GFLSdk dispo sur www.xnview.com
Au travers d'un DIB pour l'affichage.

C'est à dire que j'utilise le champs data de la structure Gfl_Bitmap
déclarer dans un module public selon la spec de l'auteur de GFL:

'Structure BITMAP
Public Type GFL_BITMAP
Type As Integer
Origin As Integer
Width As Long
Height As Long
BytesPerLine As Long
LinePadding As Integer
BitsPerComponent As Integer
ComponentsPerPixel As Integer
BytesPerPixel As Integer
Xdpi As Integer
Ydpi As Integer
TransparentIndex As Integer
ColorUsed As Long
ColorMap As Long
Data As Long
Comment As Long
MetaData As Long
End Type

Le champ Data de l'image (ou du DIB) étant fournie par la dll lors de la
lecture ou par la reservation d'un espace bitmap au travers d'une
fonction équivalente à createDIBsection, de la dll GFLsdK.
Il s'agit d'un long (pointeur sur le début de la zone mémoire).
Pour le reste j'utilise la fonction (Cf code fin de post)
extGetDIBFromBitmap
Et je gère un DIB.

Ma question est la suivante:

Si je passe à une dll C++ cet entier long et la taille de la zone
mémoire réservée, puis-je dans ma dll C++ "copier" cette zone mémoire
(sans utiliser d'API, je veux rester C++ "pur").
dans une nouvelle structure.
Et puis-je Renvoyer cette structure vers VB

Type ResultDIB

Data as long 'pointeur sur la zone de données
ScanLineWidth as long
Height as long

End type

Et ensuite de faire un CopyMemory de data renvoyé vers le champ data de
la structure Gfl_Bitmap correctement prédimensionnée?

Le but du jeu étant de gérer des opérations complexe et gourmandes en
calcul (rotation d'image, gestion d'une région polygonale associée,
transformations non conformes) et ce pour des images Noir et Blanc donc
opération au niveau du bit, avec un gain de temps qui a déjà été prouvé.
:-)
J'ajoute qu'au niveau C++ mes connaissances sont uniquement littéraire,
j'ai pas encore mis en pratique, mais j'aimerais avoir une vue
d'ensemble des possibilités avant de me lancer.




Hello,

Tout d'abord, attention à ne pas confondre C et C++. Ce sont 2 langages
totalement différents, le fait qu'ils portent des noms proches étant
probablement leur seule ressemblance (avec un air de famille dans la
syntaxe).

Mon petit tutorial marche avec C, je ne sais absolument pas
si ça marcherait en C++, je n'ai jamais essayé.

Pour revenir au C, je ne vois pas de problèmes pour réaliser ce que tu
souhaites, du moins à priori. Il faudrait faire un test de faisabilité
pour s'assurer que tout est ok, mais sur le principe, je ne vois pas
de difficultés.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
<title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Jean-Marc a &eacute;crit&nbsp;:
<blockquote cite="mid4324580b$0$343$" type="cite">
<pre wrap="">"&lt;pas-despam&gt; @Bwanadoo.fr&gt;" &lt;"&lt;pas-despam&gt; a &eacute;crit dans le message de
<a class="moz-txt-link-freetext" href="news:43243b6b$0$17225$">news:43243b6b$0$17225$</a>...
</pre>
<blockquote type="cite">
<pre wrap="">Suite &agrave; l'excellent tutoriel mis en ligne par Jean-Marc:
<a class="moz-txt-link-freetext" href="http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm">http://membres.lycos.fr/jeanmarcn/cvb/cetvb.htm</a>
8-)

Je souhaite fabriquer une dll C++ pour traiter des calculs sur une image
noir et blanc.

Je g&egrave;re l'image,pour la lecture/ecriture et la partie data du DIB, gr&acirc;ce
&agrave; la dll GFLSdk dispo sur <a class="moz-txt-link-abbreviated" href="http://www.xnview.com">www.xnview.com</a>
Au travers d'un DIB pour l'affichage.

C'est &agrave; dire que j'utilise le champs data de la structure Gfl_Bitmap
d&eacute;clarer dans un module public selon la spec de l'auteur de GFL:

'Structure BITMAP
Public Type GFL_BITMAP
Type As Integer
Origin As Integer
Width As Long
Height As Long
BytesPerLine As Long
LinePadding As Integer
BitsPerComponent As Integer
ComponentsPerPixel As Integer
BytesPerPixel As Integer
Xdpi As Integer
Ydpi As Integer
TransparentIndex As Integer
ColorUsed As Long
ColorMap As Long
Data As Long
Comment As Long
MetaData As Long
End Type

Le champ Data de l'image (ou du DIB) &eacute;tant fournie par la dll lors de la
lecture ou par la reservation d'un espace bitmap au travers d'une
fonction &eacute;quivalente &agrave; createDIBsection, de la dll GFLsdK.
Il s'agit d'un long (pointeur sur le d&eacute;but de la zone m&eacute;moire).
Pour le reste j'utilise la fonction (Cf code fin de post)
extGetDIBFromBitmap
Et je g&egrave;re un DIB.

Ma question est la suivante:

Si je passe &agrave; une dll C++ cet entier long et la taille de la zone
m&eacute;moire r&eacute;serv&eacute;e, puis-je dans ma dll C++ "copier" cette zone m&eacute;moire
(sans utiliser d'API, je veux rester C++ "pur").
dans une nouvelle structure.
Et puis-je Renvoyer cette structure vers VB

Type ResultDIB

Data as long 'pointeur sur la zone de donn&eacute;es
ScanLineWidth as long
Height as long

End type

Et ensuite de faire un CopyMemory de data renvoy&eacute; vers le champ data de
la structure Gfl_Bitmap correctement pr&eacute;dimensionn&eacute;e?

Le but du jeu &eacute;tant de g&eacute;rer des op&eacute;rations complexe et gourmandes en
calcul (rotation d'image, gestion d'une r&eacute;gion polygonale associ&eacute;e,
transformations non conformes) et ce pour des images Noir et Blanc donc
op&eacute;ration au niveau du bit, avec un gain de temps qui a d&eacute;j&agrave; &eacute;t&eacute; prouv&eacute;.
:-)
J'ajoute qu'au niveau C++ mes connaissances sont uniquement litt&eacute;raire,
j'ai pas encore mis en pratique, mais j'aimerais avoir une vue
d'ensemble des possibilit&eacute;s avant de me lancer.
</pre>
</blockquote>
<pre wrap=""><!---->

Hello,

Tout d'abord, attention &agrave; ne pas confondre C et C++. Ce sont 2 langages
totalement diff&eacute;rents, le fait qu'ils portent des noms proches &eacute;tant
probablement leur seule ressemblance (avec un air de famille dans la
syntaxe).

Mon petit tutorial marche avec C, je ne sais absolument pas
si &ccedil;a marcherait en C++, je n'ai jamais essay&eacute;.

Pour revenir au C, je ne vois pas de probl&egrave;mes pour r&eacute;aliser ce que tu
souhaites, du moins &agrave; priori. Il faudrait faire un test de faisabilit&eacute;
pour s'assurer que tout est ok, mais sur le principe, je ne vois pas
de difficult&eacute;s.

</pre>
</blockquote>
<br>
Tout d'abord merci.<br>
<br>
Je ne confond plus C et C++, apr&egrave;s relecture attentive du tutoriel et
du chapitre 1 de mon bouquin (diff&eacute;rence entre C Cansi et C++) <span
class="moz-smiley-s7"><span> :- </span></span>.<br>
Ton exemple utilises le compilateur C++ et les probl&egrave;mes de
compatibilit&eacute; principaux r&eacute;sident dans la syntaxe pour la partie commue
&agrave; C C++.<br>
Il est pr&eacute;cic&eacute; dans mon bouquin que les diff&eacute;rences sur les arguments
et valeur d'une fonction existent pour les fonctions sans arguments ou
sans valeur de retour ce qui ne sera pas mon cas.<br>
Pour le reste tant qu'&agrave; investir dans un nouveau langage je veux
profiter de la POO.<br>
Mais je note aussi que pour la partie traitement d'image je n'en ai pas
besoin, je m'efforcerai donc d'&eacute;crire ces parties avec une syntaxe
compatible.<br>
Je pense que nous en reparlerons quand je m'y mettrai.<span
class="moz-smiley-s13"><span> :-! </span></span><br>
<br>
En tout cas ton tutoriel et ta r&eacute;ponse m'ouvre des horizons tr&egrave;s
interressant car la gestion de raster 12000*8000 pixels c'est gourmand !<br>
<br>
A+<br>
<br>
Christophe<br>
<br>
<br>
<br>
</body>
</html>
Avatar
Jean-Marc
"<pas-despam> @Bwanadoo.fr>" <"<pas-despam> a écrit dans le message de
news:432462b2$0$17233$

Je ne confond plus C et C++, après relecture attentive du tutoriel et du


chapitre 1 de mon bouquin
(différence entre C Cansi et C++) :- .
Ton exemple utilises le compilateur C++ et les problèmes de compatibilité


principaux résident dans la
syntaxe pour la partie commue à C C++.
Il est précicé dans mon bouquin que les différences sur les arguments et


valeur d'une fonction existent pour > les fonctions sans arguments ou sans
valeur de retour ce qui ne sera pas mon cas.

Mon exemple utilise le compilateur C, ce qui
se fait automatiquement quand on compile un
fichier avec l'extension .c. Visual Studio
utilise le compilateur C++ si les fichiers
portent l'extension .cpp

Pour le reste tant qu'à investir dans un nouveau langage je veux profiter


de la POO.
Mais je note aussi que pour la partie traitement d'image je n'en ai pas


besoin, je m'efforcerai donc
d'écrire ces parties avec une syntaxe compatible.



C'est la chose à faire à mon avis. D'autant qu'il
est facile de trouver du code C ultra optimisé
pour faire les manips dont tu parles.

Je pense que nous en reparlerons quand je m'y mettrai. :-!
En tout cas ton tutoriel et ta réponse m'ouvre des horizons très


interressant car la gestion de raster 12000*8000 pixels c'est gourmand !

Oui c'est sur! Et c'est typiquement pour ce genre de choses
que le C est d'une grande efficacité.

En tout cas, bonne prog!

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;