Deux images superposées dans picturebox [Résolu]

Signaler
Messages postés
4
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
5 mars 2007
-
Messages postés
4
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
5 mars 2007
-
Bonjour tout le monde!!

voilà je me retrouve confronté à un problême. Je devais obtenir un picturebox contenant une grande image et une petite image superposée et centrée.
Je n'ai pas trouvé le moyen de faire ça par code.
j'ai alors contourné ça avec ceci
Mainimage.image = ("c:\image.jpg")
MainImage.BackgroundImage = ("c:\background.jpg")
MainImage.SizeMode = PictureBoxSizeMode.CenterImage

ça me donne l'affichage de ce que je souhaite obtenir. mais mon but c'est d'enregistrer le résultat en jpg...
y'a-t'il un moyen de sauvegarder l'image + le background du picturebox en une seule image?
Sinon, comment en .net puis-je obtenir le même résultat? j'ai passé l'après-midi d'hier sur google us et je n'ai rien trouvé de tel...

Merci de votre aide

9 réponses

Messages postés
292
Date d'inscription
samedi 25 février 2006
Statut
Membre
Dernière intervention
22 février 2009

Je crois que le meilleur moyen est de charger tes image dans deux controles différents, puis de placer un a un les points du de "image.jpg" dans l'image "background.jpg" grâce à image.point. Après normalement tu peux faire un SavePicture et ton problème est résolue

Reste à faire le code mais deux boucles devraient suffire:

Dim Horizontal as integer, Vertical as integer
For Vertical = 1 to image2.width
    For Horizontal = 1 to image2.height
        ... 'Place le point de image2 dans image1
    Next Horizontal
Next Vertical

Test et dis moi si ça marche!
VBGenesis
Messages postés
4
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
5 mars 2007

oh ça me plait cette idée
je vais l'essayer tout à l'heure
je te tiens au courrant
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
23
Bonjour,

cette méthode est lente et n'est indispensable que si'il y a une couleur "transparente".

Si tel n'est pas le cas (superposition pure et simple); il me semble que l'utilisation de la fonction BitBlt de la librairie gdi32 est beaucoup plus rapide.
Messages postés
4
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
5 mars 2007

hum là j'ai fait des tests sur une petite image (pour mon projet c'est 1600x1200 alors que là je teste sur du 70x70) et c'est pas très rapide.
mais ça a le mérite de marcher.
le seul problême c'est pour centrer l'image.. mais ça se calcule, je me fais pas de soucis à ce niveau, il va juste falloir que je fasse chauffer un peu mes neurones.

pour la fonction Bitblt je ne la connais pas, je vais regarder cela attentivement car en effet il n'y a aucun effet de transparence à gerer
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
23
Pour ton calcul (quelle que soit la formule retenue, il te faidra le faire) :

à gauche : (largeurtotale - largeurpetite)/2
en haut : (hauteur totale- hauteurpetite)/2
Messages postés
292
Date d'inscription
samedi 25 février 2006
Statut
Membre
Dernière intervention
22 février 2009

C'est vrai que c'est certainement plus rapide avec bitblt, mais je n'ai jamais eu l'occasion de m'en servir et je ne sais pas comment elle marche.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
23
Salut VBGenesis

"Elle" marche à peu près de la même façon que la méthode PaintPicture deVB  :

"Elle" transfère in bloc de bits d'une source vers une destination.

PaintPicture de VB l'utilise...
euh... d'une certaine façon, dirais-je, car PaintPicture en profite pour aller plus loin ..... jusqu'à StretchBlt...
Mais ici, nous n'avons besoin que de BitBlt et nous ne chargerons donc pas notre appli inutilement. (c'est l'avantage que représente l'utulisation directe des fonctions de l'Api de Windows : ne jamais se servir d'une pelle Pauclain pour seulement planter un rosier dans son jardin)
Messages postés
292
Date d'inscription
samedi 25 février 2006
Statut
Membre
Dernière intervention
22 février 2009

Salut jmfmarques! Merci pour l'explication!
J'ai trouvé un exemple (sur un site très interressent, il s'appelle VBFrance.com ) en fait c'est assez simple, suffisait juste de regarder
En tout cas je pense que aliquando a tout ce qu'il faut pour son code maintenant!
a+ et merci
VBGenesis
Messages postés
4
Date d'inscription
samedi 28 juin 2003
Statut
Membre
Dernière intervention
5 mars 2007

Bon et bien j'ai pu terminer mon projet
merci beaucoup pour l'aide. j'ai conservé la première solution

For

Horizontal = (PictureBox2.Width / 2) - (PictureBox1.Width / 2)
To (PictureBox2.Width / 2) + (PictureBox1.Width / 2) - 1

For Vertical = (PictureBox2.Height / 2) - (PictureBox1.Height / 2)
To (PictureBox2.Height / 2) + (PictureBox1.Height / 2) - 1

(j'avais fait comme ça)
Le problême c'est que le get pixel avait dans la boucle la même valeur que le setpixel (chose impossible vu que l'image1 est plus petite que l'image 2)
donc voilà ma boucle complête avec la modif

Dim myBitmap
As
New Bitmap(PictureBox1.Image)

Dim resultat
As
New Bitmap(PictureBox2.Image)

Dim Horizontal
As
Integer, Vertical
As
Integer
Dim pixcolor
As Color = myBitmap.GetPixel(Horizontal, Vertical)

Dim basehoriz
As
Integer = ((PictureBox2.Width / 2) - (PictureBox1.Width / 2))

Dim basevert
As
Integer = ((PictureBox2.Height / 2) - (PictureBox1.Height / 2))

For Horizontal = ((PictureBox2.Width / 2) - (PictureBox1.Width / 2))
To ((PictureBox2.Width / 2) + (PictureBox1.Width / 2)) - 1

For Vertical = ((PictureBox2.Height / 2) - (PictureBox1.Height / 2))
To ((PictureBox2.Height / 2) + (PictureBox1.Height / 2)) - 1
pixcolor = myBitmap.GetPixel(Horizontal - basehoriz, Vertical - basevert)
resultat.SetPixel(Horizontal, Vertical, pixcolor)

Next Vertical

Next Horizontal

Tout marche comme sur des roulettes et c'est pas si long que ça.
merci beaucoup !