Accueil > > > ZOOM AMÉLIORE AVEC ANTI-ALIASING
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
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
|
Derniers Blogs
OFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONSOFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONS par junarnoalg
De nombreuses entreprises font le choix de SharePoint Online, service fourni au travers de l'offre de Microsoft Office 365. S'il est vrai que ce choix apporte un grand nombre d'avantages; rapidité de mise en œuvre, disponibilité, large couvertu...
Cliquez pour lire la suite de l'article par junarnoalg PRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGEPRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGE par richardc
http://www.c2idotnet.com/articles/presentation-des-api-rest-de-windows-azure-lister-les-comptes-de-storage
Désolé pour "toto", mais c2i existait avant blogs.developpeur.org et c'est mon site "officiel" ;-) ...
Cliquez pour lire la suite de l'article par richardc [HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] SLIDES ET DéMOS : AUTOUR DU W3C , NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Très bonne après-midi passée lors cette conférence avec le W3C, organisée par L' Inria sur les nouveaux standards, ce Mardi 14 Février, on sent vraiment que çà bosse au W3C, et l'avenir est très très prometteur pour le HTML5, notamment ...
Cliquez pour lire la suite de l'article par Gio GESTION D'EXCEPTION AVEC LES TASKSGESTION D'EXCEPTION AVEC LES TASKS par richardc
Nous avons vu dans un précédent article comment utiliser Task pour effectuer des opérations dans un autre thread.
Malheureusement, comme tout le monde n'est pas parfait, il se peut que cette exécution se passe mal et qu'une exception se produise.
La...
Cliquez pour lire la suite de l'article par richardc
Forum
RE : VITESSERE : VITESSE par ucfoutu
Cliquez pour lire la suite par ucfoutu
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|