Réduction de la taille d'une image

Soyez le premier à donner votre avis sur cette source.

Vue 3 278 fois - Téléchargée 398 fois

Description

Cette application reprend une fonctionnalité présente dans un autre source de mon cru et déposée ici-même: le répertoire. Son utilisation est simple : on affiche une image et on demande sa réduction. Une sauvegarde de l'image réduite est possible, mais uniquement au format BMP (la visionneuse Windows sait très bien faire les conversions). Au besoin, on peut aller chercher dans les codes disponibles ici ce qu'il faut pour sauvegarder l'image dans un autre format. Ici, l'astuce a consisté à déporter vers VB la conversion au lieu de se casser la tête à trouver des formules alambiquées, du moins quand on peut se contenter du résultat obtenu, lequel n'est pas si vilain.

Conclusion :


Ben, ça devrait servir à ceux qui s'em..mouscaillent à trouver des formules alors que la solution existe déjà.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

oulipan
Messages postés
30
Date d'inscription
jeudi 10 septembre 2009
Statut
Membre
Dernière intervention
5 octobre 2013
-
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
-
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
30
Date d'inscription
jeudi 10 septembre 2009
Statut
Membre
Dernière intervention
5 octobre 2013
-
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
-
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
30
Date d'inscription
jeudi 10 septembre 2009
Statut
Membre
Dernière intervention
5 octobre 2013
-
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

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.