RÉDUCTION DE LA TAILLE D'UNE IMAGE

oulipan Messages postés 46 Date d'inscription jeudi 10 septembre 2009 Statut Membre Dernière intervention 19 février 2024 - 23 juil. 2012 à 00:15
oulipan Messages postés 46 Date d'inscription jeudi 10 septembre 2009 Statut Membre Dernière intervention 19 février 2024 - 25 juil. 2012 à 19:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54461-reduction-de-la-taille-d-une-image

oulipan Messages postés 46 Date d'inscription jeudi 10 septembre 2009 Statut Membre Dernière intervention 19 février 2024
25 juil. 2012 à 19:29
Bonsoir,Jacques-Antoine
Merci pour tout le mal que vous vous donnez.
J'ai essayé votre proposition en l'adaptant à ma sauce, (comme j'ai la flegme de copier plusieurs cmd ou pictures: for i=1 to 15:load ... +calcul des coordonnées),
mais j'en reviens toujours au paintpicture qui me permet de faire rentrer une image de n'importe quelle taille:
(en créant d'abord une image"imagvar" avec la propriété stretch=true)
(et Picture_table(0).autoredraw à true pour éviter l'effacement)
(xwx=Picture_table(0).width et yhy=Picture_table(i).height)

Imagvar.Picture = LoadPicture("add2.jpg")
For i = 0 To nb_images - 1
'Picture_table(i).Picture = LoadPicture("add2.jpg")
Picture_table(i).PaintPicture Imagvar.Picture, 0, 0, xwx, yhy

Next

(Pour plus de simplicité, je vous ai transmis un message privé)
cs_jacques-antoine Messages postés 79 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 22 mai 2017
25 juil. 2012 à 09:21
Bonjour Oulipan

Je suis allé voir les sources indiquées et j'en ai même chargé une (la première) pour essayer de comprendre de quoi on parle. Résultat : plantages en série dus à une fonction (Time) que VB ne connaît pas chez moi... Donc, je n'ai rien vu et si j'ai un conseil à donner, c'est de bannir absolument les instructions multiples qui rendent la source quasiment illisible à celui qui fourre son nez dedans, sauf à commencer par mettre de l'ordre. Aérez tout ce que vous pouvez et surtout in-den-tez : vous y gagnerez en facilité de mise au point et ceux qui vous aident gagneront du temps.

Pour ce qui est du blocage, il faut faire attention à ce que le nombre d'itérations ne dépasse pas la capacité de la variable utilisée (32767 - 1 pour un entier). Je ne suis pas certain que VB permette un tel nombre d'éléments.... Je ne vois pas non plus quel type d'application en demanderait autant. Il y a là un problème de raisonnement, à mon avis. À moins qu'il ne s'agisse pas d'éléments mais simplement d'itérations sur un même élément? Auquel cas on revient à ce que j'ai dit sur la limitation des valeurs pour une variable.

Bon, j'ai cru comprendre un certain nombre de choses et j'ai pondu une petite source qui montre comment gérer un tableau de PictureBox. Comme je ne sais pas comment adjoindre la Form, voici ce que j'ai fait :
Dans une Form principale (ici Essais) j'ai inséré un PictureBox dont le nom est Picture_table et je l'ai copié 16 fois en créant un groupe de contrôles, ce qui initialise le paramètre Index de 0 à 16 et autorise l'indexation. Les PictureBox sont répartis autour de la fenêtre et le dernier au centre. Il y a en outre 4 boutons :
Charger (Pb_charger), qui initialise toutes les images,
Charger à demi (Pb_charger_demi) qui n'en charge que la première moitié,
Effacer (Pb_effacer), qui efface tout,
Quitter (Pb_quitter) pour dégager.

il faut juste trouver deux images de 82 x 48 pixels, ou en créer deux. Le code est le suivant :

Dim nb_images As Integer ' déclaration valable pour la Form

Private Sub Form_Load()
'**************************************************
'* Fonction : initialisation *
'**************************************************

nb_images = 17

End Sub

Private Sub Pb_charger_Click()
'**************************************************
'* Fonction : chargement des images *
'**************************************************

Dim i As Integer

' le paramètre PaintPicture sert à copier un bout d'image dans
' une autre : ici, j'ai utilisé un LoadPicture pour faire plus
' simple. À priori, PaintPicture devrait pouvoir être utilisé,
' sinon, il suffit de passer par une picture intermédiaire dans
' laquelle on effecture le PaintPicture avant de la copier dans
' le tableau de destination, ce qui se fait avec l'instruction
' Picture_table(i).Picture = Picture_intermediaire.Picture
For i = 0 To nb_images - 1
Picture_table(i).Picture = LoadPicture("Suivante.jpg")
Next

End Sub

Private Sub Pb_charger_demi_Click()
'**************************************************
'* Fonction : chargement de cla moitié des images *
'**************************************************

Dim i As Integer

For i = 0 To nb_images - 1
Picture_table(i).Picture = LoadPicture("") ' effacement général
Next

For i = 0 To (nb_images / 2) - 1
Picture_table(i).Picture = LoadPicture("Precedente.jpg")
Next

End Sub

Private Sub Pb_effacer_Click()
'**************************************************
'* Fonction : effacement des images *
'**************************************************

Dim i As Integer

For i = 0 To nb_images - 1
Picture_table(i).Picture = LoadPicture("")
Next

End Sub

Private Sub Pb_quitter_Click()
'**************************************************
'* Fonction : on s'en va *
'**************************************************

End

End Sub
oulipan Messages postés 46 Date d'inscription jeudi 10 septembre 2009 Statut Membre Dernière intervention 19 février 2024
24 juil. 2012 à 12:39
Bonjour, Jacques-Antoine,
Je vous remercie de me lire, mais j'ai dû délaisser - en cas de trop grand nombre:- "picture(index).picture" en fait " [Picture1(xx * (ymax + 1) + yy).PaintPicture Imagvar.Picture, 0, 0]" , car je n'arrive pas à faire fonctionner sur mon XP le code "picture(xx).PaintPicture = Imagvar.Picture" que vous me donnez .
L'affichage de "picture(index).picture" serait intéressant, d'autant plus que l'effacement est facile, alors qu'avec la méthode paintpicture sur une seule picture ou form -pour effacer- m'oblige à refaire un affichage d'autant de segments de fond de la picture ou de la form qu'il y a d'images à effacer.
En effet, l'affichage de pictures multiples est beaucoup trop long sur le mien (ex:40x20=800 pictures en 16 secondes, sans compter la durée d'effacement...), alors que la méthode paintpicture sur une seule form ou une seule picture est quasi immédiat (testé pour 400x90=36000 images) -et impossible avec picture(36000):ça bloque dès 40x40!
(J'ai utilisé ça pour visualiser les groupements ou distributions sur mes petits programmes concernant les opérations:
http://www.vbfrance.com/codes/EXERCICES-PREPARATOIRES-DIVISION_54351.aspx
http://www.vbfrance.com/codes/TECHNIQUE-TRADITIONNELLE-DIVISION_54279.aspx
http://www.vbfrance.com/codes/ENTRAINEMENT-EFFECTUER-MULTIPLICATIONS-COLONNES-TECHN-TRAD_54186.aspx
et tables, additions, soustractions)

Si vous connaissez des astuces qui me permettent de faire autrement, je suis preneur, car je ne suis qu'un bricoleur.
En vous remerciant de m'avoir lu.
cs_jacques-antoine Messages postés 79 Date d'inscription mardi 7 octobre 2003 Statut Membre Dernière intervention 22 mai 2017
23 juil. 2012 à 18:30
oui, mais on pourrait encore simplifier en utilisant un tableau de pictures (Index = 0 à nb_pictures - 1), ce qui donnerait :

for xx = 0 to nb_pictures - 1
picture(xx).PaintPicture = Imagvar.Picture
next

En changeant la taille des pictures, on s'affranchit de l'obligation de gérer les déplacements dans la picture cible. De plus, cette manière de procéder permet de gérer un tableau de pictures à deux dimensions...
oulipan Messages postés 46 Date d'inscription jeudi 10 septembre 2009 Statut Membre Dernière intervention 19 février 2024
23 juil. 2012 à 00:15
Dans le même ordre d'idée, voilà ce que j'utilise pour réduire mes images au format désiré:
'1 contrôle image (imagevar) avec coordonnées hors écran (avec stretch=true) et un contrôle picture avec la méthode paintpicture
'coimg=mesure du côté désiré(si je veux une image carrée)
exemple:
Private Sub mille(Index) coimg 570: Imagvar.Height coimg: Imagvar.Width = coimg: Imagvar.Picture = LoadPicture(CurDir & "\t1000.jpg") For xx 1 To Index: Picture1.PaintPicture Imagvar.Picture, xl7, yl7, coimg, coimg: yl7 yl7 + 700: Next xx '(je répète l'image pour mes besoins)
End Sub
Rejoignez-nous