|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
ZOOM AMÉLIORE AVEC ANTI-ALIASING
Information sur la source
Description
Je n'ai pas trouvé qu'équivalent sur ce site donc j'en profite pour poster cette source. Il s'agit de faire un zoom sur une image, mais en essayant d'éviter l'effet de pixélisation qui en resulte. Bien entendu, les pixels affichés ne correspondent pas à un zoom de chaque pixel, mais sont la somme des pixels avoisinant + le pixel courant le tout divisé par 5. Cela donne un effet de flou, et atténue l'effet de pixélisation. Pour voir l'effet, regardez la capture : l'image du haut est obtenue grâce à ma méthode, et l'image du bas est obtenue avec la fonction PaintPicture qui étire bêtement les pixels et qui donne au final une image très pixélisée. J'utilise bien entendu ma classe de gestion d'image pour les manipulations ce qui permet d'obtenir des affichages quasi instantannée.
Source
- Private Sub cmdZoom_Click(Index As Integer)
-
- 'déclaration des variables privées
- Dim oGestionImageSrc As New CGestionImage
- Dim oGestionImageDest As New CGestionImage
- Dim iFor1 As Integer 'stocke les valeurs de la boucle For->Next
- Dim iFor2 As Integer 'stocke les valeurs de la boucle For->Next
- Dim iZoom As Integer 'stocke le rapport du zoom
- Dim dZoomIndexX As Double 'stocke l'index du zoom lors du parcours sur X
- Dim dZoomIndexY As Double 'stocke l'index du zoom lors du parcours sur Y
- Dim iZoomIndexX As Integer 'stocke l'index entier du zoom lors du parcourt sur X
- Dim iZoomIndexY As Integer 'stocke l'index entier du zoom lors du parcourt sur Y
- Dim iBleu As Byte 'stocke la composante bleue à récupèrer
- Dim iVert As Byte 'stocke la composante verte à récupèrer
- Dim iRouge As Byte 'stocke la composante rouge à récupèrer
- Dim iBleuCouleur As Double 'stocke la composante bleue à appliquer
- Dim iVertCouleur As Double 'stocke la composante verte à appliquer
- Dim iRougeCouleur As Double 'stocke la composante rouge à appliquer
-
- 'on définit le rapport du zoom
- Let iZoom = Choose(Index, 2, 4, 8)
-
- 'on force le picturebox de destination à être de la bonne taille
- Let pctDest.Width = pctSource.Width * iZoom
- Let pctDest.Height = pctSource.Height * iZoom
- Let pctDest2.Width = pctSource.Width * iZoom
- Let pctDest2.Height = pctSource.Height * iZoom
-
- 'on définit les contrôles sources et destination
- Set oGestionImageSrc.PictureBox = pctSource
- Set oGestionImageDest.PictureBox = pctDest
-
- 'on parcourt les pixels 1 ) 1 et on les agrandit avec une moyenne des pixels alentours
- For iFor1 = 0 To pctDest.ScaleWidth
-
- For iFor2 = 0 To pctDest.ScaleHeight
-
- 'on définit l'index du zoom sur X et Y
- Let dZoomIndexX = iFor1 / iZoom
- Let dZoomIndexY = iFor2 / iZoom
- Let iZoomIndexX = dZoomIndexX
- Let iZoomIndexY = dZoomIndexY
-
- 'on définit la couleur du pixel courant à partir de la couleur courante
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleu * 2
- Let iVertCouleur = iVert * 2
- Let iRougeCouleur = iRouge * 2
-
- 'mais aussi des couleurs alentours avec moyenne de toutes les couleurs
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, (dZoomIndexY), iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexX + 1) - dZoomIndexX))
- Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexX + 1) - dZoomIndexX))
- Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexX + 1) - dZoomIndexX))
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexX - iZoomIndexX))
- Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexX - iZoomIndexX))
- Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexX - iZoomIndexX))
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY - 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexY + 1) - dZoomIndexY))
- Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexY + 1) - dZoomIndexY))
- Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexY + 1) - dZoomIndexY))
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY + 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexY - iZoomIndexY))
- Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexY - iZoomIndexY))
- Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexY - iZoomIndexY))
-
- 'on prend aussi en compte les pixels en diagonales en tenant compte de la distance
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, dZoomIndexY - 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
- Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
- Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY - 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
- Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
- Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, dZoomIndexY + 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
- Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
- Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
- Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY + 1, iRouge, iVert, iBleu)
- Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
- Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
- Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
-
- Let iBleuCouleur = iBleuCouleur / (4 + Sqr(2))
- Let iVertCouleur = iVertCouleur / (4 + Sqr(2))
- Let iRougeCouleur = iRougeCouleur / (4 + Sqr(2))
- If iBleuCouleur > 255 Then Let iBleuCouleur = 255
- If iVertCouleur > 255 Then Let iVertCouleur = 255
- If iRougeCouleur > 255 Then Let iRougeCouleur = 255
- If iBleuCouleur < 0 Then Let iBleuCouleur = 0
- If iVertCouleur < 0 Then Let iVertCouleur = 0
- If iRougeCouleur < 0 Then Let iRougeCouleur = 0
-
- Call oGestionImageDest.SetPixelRGB(iFor1, iFor2, iRougeCouleur, iVertCouleur, iBleuCouleur)
-
- Next iFor2
-
- Next iFor1
-
- Call oGestionImageDest.Refresh
-
- 'on compare avec Paintpicture :
- pctDest2.PaintPicture pctSource, 0, 0, pctSource.ScaleWidth * iZoom, pctSource.ScaleHeight * iZoom, 0, 0, pctSource.ScaleWidth, pctSource.ScaleHeight, vbSrcCopy
-
- End Sub
Private Sub cmdZoom_Click(Index As Integer)
'déclaration des variables privées
Dim oGestionImageSrc As New CGestionImage
Dim oGestionImageDest As New CGestionImage
Dim iFor1 As Integer 'stocke les valeurs de la boucle For->Next
Dim iFor2 As Integer 'stocke les valeurs de la boucle For->Next
Dim iZoom As Integer 'stocke le rapport du zoom
Dim dZoomIndexX As Double 'stocke l'index du zoom lors du parcours sur X
Dim dZoomIndexY As Double 'stocke l'index du zoom lors du parcours sur Y
Dim iZoomIndexX As Integer 'stocke l'index entier du zoom lors du parcourt sur X
Dim iZoomIndexY As Integer 'stocke l'index entier du zoom lors du parcourt sur Y
Dim iBleu As Byte 'stocke la composante bleue à récupèrer
Dim iVert As Byte 'stocke la composante verte à récupèrer
Dim iRouge As Byte 'stocke la composante rouge à récupèrer
Dim iBleuCouleur As Double 'stocke la composante bleue à appliquer
Dim iVertCouleur As Double 'stocke la composante verte à appliquer
Dim iRougeCouleur As Double 'stocke la composante rouge à appliquer
'on définit le rapport du zoom
Let iZoom = Choose(Index, 2, 4, 8)
'on force le picturebox de destination à être de la bonne taille
Let pctDest.Width = pctSource.Width * iZoom
Let pctDest.Height = pctSource.Height * iZoom
Let pctDest2.Width = pctSource.Width * iZoom
Let pctDest2.Height = pctSource.Height * iZoom
'on définit les contrôles sources et destination
Set oGestionImageSrc.PictureBox = pctSource
Set oGestionImageDest.PictureBox = pctDest
'on parcourt les pixels 1 ) 1 et on les agrandit avec une moyenne des pixels alentours
For iFor1 = 0 To pctDest.ScaleWidth
For iFor2 = 0 To pctDest.ScaleHeight
'on définit l'index du zoom sur X et Y
Let dZoomIndexX = iFor1 / iZoom
Let dZoomIndexY = iFor2 / iZoom
Let iZoomIndexX = dZoomIndexX
Let iZoomIndexY = dZoomIndexY
'on définit la couleur du pixel courant à partir de la couleur courante
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleu * 2
Let iVertCouleur = iVert * 2
Let iRougeCouleur = iRouge * 2
'mais aussi des couleurs alentours avec moyenne de toutes les couleurs
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, (dZoomIndexY), iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexX + 1) - dZoomIndexX))
Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexX + 1) - dZoomIndexX))
Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexX + 1) - dZoomIndexX))
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexX - iZoomIndexX))
Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexX - iZoomIndexX))
Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexX - iZoomIndexX))
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY - 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexY + 1) - dZoomIndexY))
Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexY + 1) - dZoomIndexY))
Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexY + 1) - dZoomIndexY))
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX, dZoomIndexY + 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexY - iZoomIndexY))
Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexY - iZoomIndexY))
Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexY - iZoomIndexY))
'on prend aussi en compte les pixels en diagonales en tenant compte de la distance
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, dZoomIndexY - 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexX + 1) - dZoomIndexX)) * (Sqr(2) / 2)
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY - 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexX - iZoomIndexX)) * (Sqr(2) / 2)
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX - 1, dZoomIndexY + 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
Let iVertCouleur = iVertCouleur + (iVert * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
Let iRougeCouleur = iRougeCouleur + (iRouge * ((iZoomIndexY + 1) - dZoomIndexY)) * (Sqr(2) / 2)
Call oGestionImageSrc.GetPixelRGB(dZoomIndexX + 1, dZoomIndexY + 1, iRouge, iVert, iBleu)
Let iBleuCouleur = iBleuCouleur + (iBleu * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
Let iVertCouleur = iVertCouleur + (iVert * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
Let iRougeCouleur = iRougeCouleur + (iRouge * (dZoomIndexY - iZoomIndexY)) * (Sqr(2) / 2)
Let iBleuCouleur = iBleuCouleur / (4 + Sqr(2))
Let iVertCouleur = iVertCouleur / (4 + Sqr(2))
Let iRougeCouleur = iRougeCouleur / (4 + Sqr(2))
If iBleuCouleur > 255 Then Let iBleuCouleur = 255
If iVertCouleur > 255 Then Let iVertCouleur = 255
If iRougeCouleur > 255 Then Let iRougeCouleur = 255
If iBleuCouleur < 0 Then Let iBleuCouleur = 0
If iVertCouleur < 0 Then Let iVertCouleur = 0
If iRougeCouleur < 0 Then Let iRougeCouleur = 0
Call oGestionImageDest.SetPixelRGB(iFor1, iFor2, iRougeCouleur, iVertCouleur, iBleuCouleur)
Next iFor2
Next iFor1
Call oGestionImageDest.Refresh
'on compare avec Paintpicture :
pctDest2.PaintPicture pctSource, 0, 0, pctSource.ScaleWidth * iZoom, pctSource.ScaleHeight * iZoom, 0, 0, pctSource.ScaleWidth, pctSource.ScaleHeight, vbSrcCopy
End Sub
Historique
- 16 octobre 2004 20:17:14 :
- 01 novembre 2004 21:11:26 :
- Mise à jour de la source avec un résultat bien moins crénelé qu'avant. Pour ce faire, la remarque de ennixo m'a inspirée une nouvelle méthode tenant compte de la position des pixels autour du pixel de destination. Merci à toi ennixo ;)
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Un zoom plus petit que dans la source de Joe Ace (#235) [ par WebMagique ]
Peut-on faire un ZOOM plus petitque dans le code exemple de Joe Ace?http://www.vbfrance.com/index.asp?Val=235grand merci...
zoom et police [ par sinouhé ]
J'ai un richtextbox que je veux redimensionner à la taille écran... facile.Mais je souhaite effectuer un effet zoom du contenu de cet écran... effectu
Faire un zoom (tout simplement) [ par Surfin ]
Bonjour,Je souhaiterais tout simplement faire un p'tit soft qui permet entre autre de faire un zoom (réglable si possible) d'une petite partie de l'éc
Antialiasing [ par CapCaverne ]
Salut tout le monde !Est ce que quelqu'un aurait une demo d'un code qui traite l'antialiasing en VB ??Merci d'avance !!
zoom fenêtre [ par bast42 ]
je cherche à faire un zoom fenêtre sur un MSChart mais je ne sais pas comment on peut faire,j'ai essayé de dessiner une Shape mais elle est dans un pl
directx :au secours!!!! [ par lilie ]
J'ai un gros pb ; je possède des tutoriaux en directx dont l'un avec un cylindre qui tourne et un jeu de lumière!Lorque je lance mon programme qui n'a
Une image dans une picturebox et un zoom de au dessus du curseur dans une autre [ par captaincav ]
salou :)bon, j'explique mon probleme, meme si ca va pas etre tres evident huhuvoila, j'ai 2 picturebox, une avec une image dedans (que l'on va appeler
zoom sur un data report [ par yayoo ]
salut,J'aimerais pouvoir controler le zoom de l'apercu d'un rapport. pour dessiner ce rapport j'utilise un DataReport mais je n'arrive pas à trouver l
Zoom [ par sawn77 ]
Bonjour!Je voudrais faire une animation et j'aurai besoin de faire un zoom mais je ne sais pas du tout comment faire!!En fait j'ai une scène qui repre
Zoom non voulu dans un OLE [ par OrionMelancholy ]
J'ai un petit problème bien désagréable, j'ai inclu dans un contrôle OLE une feuille Excel, j'ai tout bien calculé la taille mais un événement extèrie
|
Téléchargements
Logiciels à télécharger sur le même thème :
|