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

aliquando 4 Messages postés samedi 28 juin 2003Date d'inscription 5 mars 2007 Dernière intervention - 4 mars 2007 à 10:17 - Dernière réponse : aliquando 4 Messages postés samedi 28 juin 2003Date d'inscription 5 mars 2007 Dernière intervention
- 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
Afficher la suite 

9 réponses

Répondre au sujet
VBGenesis 305 Messages postés samedi 25 février 2006Date d'inscription 22 février 2009 Dernière intervention - 4 mars 2007 à 13:44
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de VBGenesis
aliquando 4 Messages postés samedi 28 juin 2003Date d'inscription 5 mars 2007 Dernière intervention - 4 mars 2007 à 14:44
0
Utile
oh ça me plait cette idée
je vais l'essayer tout à l'heure
je te tiens au courrant
Commenter la réponse de aliquando
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 4 mars 2007 à 15:09
0
Utile
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.
Commenter la réponse de jmfmarques
aliquando 4 Messages postés samedi 28 juin 2003Date d'inscription 5 mars 2007 Dernière intervention - 4 mars 2007 à 16:11
0
Utile
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
Commenter la réponse de aliquando
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 4 mars 2007 à 18:52
0
Utile
Pour ton calcul (quelle que soit la formule retenue, il te faidra le faire) :

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.