Redimensionnement d'image [Résolu]

Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
- - Dernière réponse : bilaloch
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
- 28 déc. 2007 à 13:12
Bonjour à tous,

J'aimerais en savoir plus sur le redimensionnement d'image. Toutes les techniques que j'ai vu sur le site utilisent des PictureBox pour redimensionner les images. Or, j'aimerais pouvoir le faire par d'autres moyens (APIs, ou autres fonctions...) car d'un côté je ne veux pas être dépendant de contrôles (histoire d'être plus propre de mon point de vue...) et d'un autre le résultat est plutôt moche (l'image ainsi redimensionnée semble avoir perdu de la qualité)...

Merci d'avance à tous,

BILALoch
Afficher la suite 

20/33 réponses

Meilleure réponse
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
3
Merci
salut,

voici une manière sans contrôle :
http://www.vbfrance.com/codes/DESSINER-PASSANT-PICTUREBOX-MODULE-CLASSE_43226.aspx

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
3
Merci
... évidemment puisque c'est en utilisant PAINTPICTURE !!!
ta demande n'était pas de te passer d'un HDC physique?

sans méchanceté : pense à mettre le lien de ce topic dans ta source, çà sera moins amusant je pense.
pour du miniature je te dis qu'il y a des API utilisables !!!

t'as juste à intégrer le module..
http://www.vbfrance.com/codes/EXTRACTION-MINIATURES-FICHIERS-COMME-DANS-EXPLORATEUR-MODE-DETAILS_39524.aspx

remarque tu n'as pas essayé le précédent lien alors pourquoi le faire avec celui-ci
++ bonne soirée

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
3
Merci
VirtualPBDest n'as pas de hDC initialisé au moment où tu l'utilises

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de PCPT
Messages postés
258
Date d'inscription
mercredi 21 avril 2004
Statut
Membre
Dernière intervention
27 octobre 2010
3
0
Merci
salut
as tu regardé du coté de l'api "StretchBlt"

perso je l'utilise lorsque je souhaite géré un redimensionnement dynamique d'une picture box.... la dégradation éventuelle de l'image est plus liée à sa qualité d'origine qu'au redimensionnement proprement dit..

sur ce...

bonne journée

Pat

 Don't Worry , Be Happy

<hr />lorsque le problème est résolu, pensez Réponse Acceptée
Commenter la réponse de pneau
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
18
0
Merci
car d'un côté je ne veux pas être dépendant de contrôles (histoire d'être plus propre de mon point de vue...) et d'un autre le résultat est plutôt moche (l'image ainsi redimensionnée semble avoir perdu de la qualité)...




Je vois mal comment tu pourrais ne pas être dépendant d'un contrôle, à moins que tu ne nous aies pas tout dit de ce que tu entends par "redimensionnement d'une image" .... Qu'est exactement pour toi une image ? Ne voudrais-tu pas plutôt parler de fichier graphique ?

Une image redimensionnée perd forcément de sa qualité (en retrécissement, il va bien falloir enlever des pixels  quelque part, par exemple... ce sera moins mal en agrandissement, mais se posera quand même un problème également ... tiens : imagine que tu augmentes la largeur d'un pixel ... lequel ajouteras-tu ?))
Commenter la réponse de jmfmarques
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Merci pour vos réponses. Bon, alors dans l'ordre :


- pneau : je te remercie de ton idée. Je garde à l'esprit ton API si je n'ai pas d'autres solutions (car dans ton API on passe encore en arguments des contrôles PictureBox, or, c'est ce que j'aimerais éviter).

- jmfmarques : je t'explique. Une image est pour moi un fichier image. En gros j'aimerais pouvoir écrire une fonction dans un module indépendant (donc sans contrôle) qui pourrait faire quelque chose comme :
"ReDimensionner (CheminSource As String, CheminDestination As String)", où "CheminSource" désigne le lien du fichier image à redimensionner et "CheminDestination" désigne le lien du fichier image redimensionné.
Pour finir, je dirai qu'une perte de qualité dans tes deux cas est normale, mais que certains algos permettent de garder le maximum de qualité dans le fichier redimensionné par certaines techniques (par exemple, au lieu de supprimer des pixels, ça fait une sorte de moyenne entre les différents pixels de l'endroit du redimensionnement...), et je ne suis pas sûr que cela se fait rapidement en VB, c'est pourquoi je voulais en savoir davantage...

BILALoch
Commenter la réponse de bilaloch
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Aujourd'hui PCPT, tu es une vraie furie :D Non sérieusement, merci pour tes réponses instructives. J'aimerais te poser une question : comment puis je perdre le moins de qualité sur le redimensionnement d'une image ? Parce que je remarque bien qu'entre une classe de redim écrite en VB et le résultat obtenu sur toshop, il y a une réelle différence de qualité :(

BILALoch
Commenter la réponse de bilaloch
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
0
Merci
re,

c'est pas le principe d'une classe mais de ce que tu fais au final...
c'est sur que de re-dimensionner un bmp 800*600 en bmp 400*300, çà rendra bien plus net qu'un jpg de 1000*850 en bmp 400*300 ....

après reste à voir comment tu t'y prendras, à savoir ma classe (pour l'exemple), un bitblt, du stretchblt, paintpicture, gdi+ etc....

le lien que je t'ai donné permet d'avoir un hdc sans picturebox et contient quelques fonctions pratiques dont le resize mais ce n'est pas forcément optimisé pour.... à toi de voir selon tes images.
surtout si, cumulé avec ta dernière question, tu travailles en jpg! pour conserver la qualité il sera peut-être préférable de re-dimensionner avant de convertir

bon courage ++
PCPT  [AFCK]
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Ne t'inquiètes pas, je redimensionne l'image avant de la transformer en JPG. Mais bon... malgré cela, l'image redimensionnée en plus petite a une qualité assez médiocre :S Cela est assez étonnant d'ailleurs... J'ai ensuite essayé de rendre l'image floue avant de la redimensionner, et aussi de la pixeliser avant de la redimensionner, mais dans les 2 cas, la perte de qualité est présente... As tu une idée pour moi ? De la doc, des liens, des contacts...? :)

Merci encore,

BILALoch
Commenter la réponse de bilaloch
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
0
Merci
montre un bout de code? voir comment tu t'y prends ?
Commenter la réponse de PCPT
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Le code que je te donne permet de redimensionner une image en une autre de 100 * 100 pixels (on centre l'image, sans la déformer). Je précise que je ne peux donner qu'un bout du code ici, pas assez de place pour le reste, donc il y a quelques appels de fonction assez incompréhensibles sans le reste du code, mais c'est le plus important. Voilà :

Public Function Redimensionner(FichierSource As String, FichierDestination As String, frmReDim As Form, PicSource As PictureBox, PicDestination As PictureBox, Taille As Integer)
    ' ---Change le pointeur de la souris---
    Screen.MousePointer = vbHourglass
    ' ---Déclaration des variables---
    Dim Ret As Long
    Dim Hauteur As Long
    Dim Largeur As Long
    Dim Recupere As Long
    Dim cDib As New cDIBSection
    Dim Bits() As Byte
    
    PicSource.AutoSize = True
    PicSource.AutoRedraw = True
    PicDestination.AutoRedraw = True
    PicSource.Appearance = 0
    PicDestination.Appearance = 0
    PicSource.BorderStyle = 0
    PicDestination.BorderStyle = 0
    
    ' ---Initialisation---
    PicSource.ScaleMode = vbPixels
    PicDestination.ScaleMode = vbPixels
    frmReDim.ScaleMode = vbPixels
    
    PicSource.Picture = LoadPicture(FichierSource)
    
    DC = GetPixelData(PicSource.Image, Bits())
    Mosaique Bits(), 0, 0, PicSource.ScaleWidth, PicSource.ScaleHeight, 5, 5
    SetPixelData DC, PicSource.Image, Bits()
    
    PicDestination.Height = Taille
    PicDestination.width = Taille
    
    If PicSource.width > PicSource.Height Then
        Recupere = PicSource.Height
    Else
        Recupere = PicSource.width
    End If
    
    PicDestination.PaintPicture PicSource, 0, 0, PicDestination.ScaleWidth, PicDestination.ScaleHeight, (PicSource.width / 2) - (Recupere / 2), (PicSource.Height / 2) - (Recupere / 2), Recupere, Recupere
    PicDestination.Picture = PicDestination.Image
    ' ---Remet le pointeur de la souris par défaut---
    
    cDib.CreateFromPicture PicDestination.Picture
    
    Screen.MousePointer = vbDefault
    
    SaveJPG cDib, FichierDestination, 100
End Function

J'espère que cela t'a un peu aidé pour comprendre mon problème. Si tu veux le code intégral, je pourrais te l'envoyer par mail.

Merci ^^

BILALoch
Commenter la réponse de bilaloch
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
Commenter la réponse de PCPT
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Merci pour le lien :) Voilà mon code simplifié. N'hésite pas à le tester pour me dire ce que tu en penses...

BILALoch
Commenter la réponse de bilaloch
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
J'aimerais te poser une autre question. Si j'applique une API genre SetPixel pour colorier ma PictureBox, comment pourrais je faire pour l'enregistrer ? Avec SavePicture, l'image reste normale, même après un appel à la fonction Refresh de la PictureBox...

BILALoch
Commenter la réponse de bilaloch
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
0
Merci
pour le code.... il n'y a qu'un paintpicture?! je pensais que tu ne passais pas par une picturebox?!!
et les API? tu as essayé? quel code?
savepicture, me semble que c'est intégré dans ma classe

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Je n'ai pas encore utilisé ta classe ^^ . J'ai testé avec les APIs, même résultat. L'image redimensionnée est exactement la même, c'est-à-dire qu'il y a une perte de qualité claire dans les deux cas. Donc le problème ne disparaîtra avec ta classe. C'est pourquoi je prefère corriger cela avant d'integrer ton travail dans le tout ^^ .

Merci encore ^^ ,

BILALoch
Commenter la réponse de bilaloch
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
18
0
Merci
A moins que tu ne développes ton propre code, tu n'obtiendras à mon avis rien de mieux qu'en utilisant la fonction SetStretchBlt avec HALFTONE
 
Commenter la réponse de jmfmarques
Messages postés
554
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
9 juillet 2014
0
Merci
Merci jmfmarques, c'est bien ce que je me disais. J'ai trouvé mon bonheur en la codant moi même XD (j'y taffe depuis 9 h du matin lol). Je compte poster une source là dessus, ça pourrait aider, et les gens qui ont besoin d'une technique du genre, et moi pour optimiser mon code avec quelques conseils constructifs (notamment sur la qualité et le temps que ça prend pour la réduire).

BILALoch
Commenter la réponse de bilaloch
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
0
Merci
désolé mais en restant proportionnel, perso je vois peu de différence...
testé avec une JPG 1024*768 :

encore qu'il est possible d'utiliser les API pour obtenir directement les thumbnails !!
voir les sources existantes

++ ;)
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT
Messages postés
13298
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
25
0
Merci
arf çà a buggé....

    With Picture2
        .Width = Picture1.Width / 2
        .Height = Picture1.Height / 2
        DoEvents
        .ScaleMode = vbPixels
        .PaintPicture Picture1, 0, 0, .Width,
.Height, 0, 0, Picture1.Width, Picture1.Height,
vbSrcCopy
    End With

<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Commenter la réponse de PCPT