Deux images superposées dans picturebox

Résolu
aliquando Messages postés 4 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 5 mars 2007 - 4 mars 2007 à 10:17
aliquando Messages postés 4 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 5 mars 2007 - 5 mars 2007 à 00:03
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

VBGenesis Messages postés 292 Date d'inscription samedi 25 février 2006 Statut Membre Dernière intervention 22 février 2009
4 mars 2007 à 13:44
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
3
aliquando Messages postés 4 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 5 mars 2007
4 mars 2007 à 14:44
oh ça me plait cette idée
je vais l'essayer tout à l'heure
je te tiens au courrant
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
4 mars 2007 à 15:09
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.
0
aliquando Messages postés 4 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 5 mars 2007
4 mars 2007 à 16:11
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
4 mars 2007 à 18:52
Pour ton calcul (quelle que soit la formule retenue, il te faidra le faire) :

à gauche : (largeurtotale - largeurpetite)/2
en haut : (hauteur totale- hauteurpetite)/2
0
VBGenesis Messages postés 292 Date d'inscription samedi 25 février 2006 Statut Membre Dernière intervention 22 février 2009
4 mars 2007 à 20:38
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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
4 mars 2007 à 20:53
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)
0
VBGenesis Messages postés 292 Date d'inscription samedi 25 février 2006 Statut Membre Dernière intervention 22 février 2009
4 mars 2007 à 23:05
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
0
aliquando Messages postés 4 Date d'inscription samedi 28 juin 2003 Statut Membre Dernière intervention 5 mars 2007
5 mars 2007 à 00:03
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 !
0
Rejoignez-nous