Redimensionnement d'image

Résolu
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 - 26 déc. 2007 à 11:14
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 - 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

33 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 déc. 2007 à 13:46
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
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 déc. 2007 à 23:07
... é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
3
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 déc. 2007 à 10:32
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
3
pneau Messages postés 258 Date d'inscription mercredi 21 avril 2004 Statut Membre Dernière intervention 27 octobre 2010 5
26 déc. 2007 à 11:32
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
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
26 déc. 2007 à 11:58
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 ?))
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
26 déc. 2007 à 12:13
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
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
26 déc. 2007 à 17:50
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 déc. 2007 à 18:23
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
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
26 déc. 2007 à 21:28
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 déc. 2007 à 22:06
montre un bout de code? voir comment tu t'y prends ?
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
26 déc. 2007 à 22:27
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 déc. 2007 à 23:21
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
27 déc. 2007 à 08:34
Merci pour le lien :) Voilà mon code simplifié. N'hésite pas à le tester pour me dire ce que tu en penses...

BILALoch
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
27 déc. 2007 à 10:07
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 déc. 2007 à 12:19
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
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
27 déc. 2007 à 12:41
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
27 déc. 2007 à 15:03
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
 
0
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
27 déc. 2007 à 16:05
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 déc. 2007 à 19:17
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
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 déc. 2007 à 19:19
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
0
Rejoignez-nous