Se connecter / S'enregistrer
Votre question

[c#] PictureBox Zoom sans Flou/Perte de pixels

Tags :
  • Zoom
  • Programmation
Dernière réponse : dans Programmation
a b L Programmation
31 Mai 2012 18:59:30

Bonjour,

Pour un projet j'ai un tableau a deux dimension de int de taille 31;31
et je doit afficher une représentation graphique de ce tableau dans une pictureBox
Donc j'ai fais une pictureBox de 465;465 ... ( 31*15 ; 31*15 )

Si j'affiche l'image dans la pictureBox ( sizeMode : centerimage ) j’obtiens : http://ploof.eu/tcif

Si je passe la pictureBox sizeMode:Zoom j'obtiens : http://ploof.eu/l5ju ; On remarque deja qu'il manque une ligne de pixel en haut et a gauche !!

Si j'utilise ce petit morceau de code que j'ai trouvais sur le net :
  1. var resizedBmp = new Bitmap(imap.Width * 15, imap.Height * 15);
  2. using (var g = Graphics.FromImage(resizedBmp))
  3. {
  4. g.InterpolationMode = InterpolationMode.NearestNeighbor;
  5. g.DrawImage(imap, new Rectangle(Point.Empty, resizedBmp.Size));
  6. g.Flush();
  7. }
  8. pictureBox1.Image = resizedBmp;


( avec imap = l'image de 31;31 )

Donc avec ce code j’obtiens : http://ploof.eu/olxe
Il manque toujours la ligne de pixel en haut et a gauche ...

Comment avoir un grossissement d'une image sans perte de pixel ni flou ?

Autres pages sur : picturebox zoom flou perte pixels

a b L Programmation
2 Juin 2012 01:43:36

Bon j'utilise actuellement :
  1. private Bitmap I31to465(Bitmap iBitmap)
  2. {
  3. Bitmap big = new Bitmap(465,465);
  4. for (int i = 0; i < iBitmap.Width; i++)
  5. {
  6. for (int j = 0; j < iBitmap.Height; j++)
  7. {
  8. Couleur couleur = iBitmap.GetPixel(i,j);
  9. for (int k = 0; k < 15; k++)
  10. {
  11. for (int l = 0; l < 15; l++)
  12. {
  13. big.SetPixel(15*i+k,15*j+l,couleur);
  14. }
  15. }
  16. }
  17. }
  18. return big;
  19. }


Si quelqu'un trouve plus OPTI :D 
m
0
l
a c 232 L Programmation
2 Juin 2012 10:17:48

J'ai essayé rapidement hier, j'ai pas trop trouvé de solution en effet, bizarre ce problème avec PictureBox qui ne met pas la photo à 100%, j'avais jamais vu ce problème... Enfin généralement j'ai plutôt des images de 16x16 ou 32x32 alors ça se voit moins :) 
m
0
l
a b L Programmation
2 Juin 2012 19:12:38

Si tu fais cette interpolation en dégradé, tu obtiens forcément un dégradé. :) 
A voir, si tu peux indiquer de ne pas faire d'interpolation.

Si tu veux le faire toi-même, il faut se contenter de 2 boucles, et comme pour tout effet graphique, on boucle toujours sur l'image finale (donc 465, et tu fais GetPixel(i/15,j/15), mais ça ne réduit pas le nombre de boucles. ;) 
Pour le faire toi-même de façon optimisé, il faut travailler directement sur le buffer de l'image (ce sont les GetPixel et SetPixel qui sont en réalité couteux).
Il te faut utiliser un système de lock/unlock de ton bitmap pour pouvoir écrire dans un buffer de manière optimisé.

En vérifiant que la méthode de lock existe bien en .NET, je suis tombé sur un exemple:
http://msdn.microsoft.com/en-us/library/5ey6h79d
Toi, tu en verrouilles un en lecture, et l'autre en écriture.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS