2010-12-10 32 views
4

J'ai une image qui est 1px de large, et une certaine hauteur. J'ai besoin de dessiner cette image sur toute la largeur du contrôle sur son événement OnPaint. Je l'ai pour dessiner, mais pas correctement. Il semble que quand il l'étire, il ne remplit pas réellement tous les pixels. Comme si l'interpolation est désactivée. Existe-t-il un moyen de dire «arrête d'être intelligent, dessine-le déjà»? Je ne vois pas InterpolationMode.Off ou .None dans les options de l'objet graphique.C# Dessine l'image (mise à l'échelle) sur Graphics, n'interpole pas correctement. Corrige?

Je peux confirmer que je dessine réellement toute la largeur en utilisant une image de largeur X où X a la même largeur que le contrôle. Puis, quand il dessine, il couvre la zone entière comme d'habitude. Cependant, ce contrôle est redimensionné tout le temps, et pour économiser de la mémoire et tout ce jazz en utilisant des images larges 1px est tout à fait normal dans le monde Web. C'est pour une application C# de bureau cependant. Des idées pour résoudre le problème? InterpolationMode.NearestNeighbor est ce que vous voulez utiliser dans ce cas.

Répondre

9

Ok je compris les mots-clés magiques:

g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; 

Ce Couplé avec réglage du mode d'interpolation permet NearestNeighbour un bloc complet à tirer.

Sans définir le mode Interpolation, vous obtenez un mélange bizarre (attendu). Sans définir le PixelOffsetMode, l'algorithme du plus proche voisin n'a pas de voisin à comparer sur une peinture vierge et ne dessine donc que la moitié de l'image, pour la moitié de la largeur. En le décalant de moitié, il déplace tout sur -0.5px, et permet à cet algorithme de fonctionner pour les textures de blocs.

+2

J'ai eu le même problème et après avoir essayé plusieurs variantes de PixelOffsetMode et InterpolationMode, c'est ce qui a fonctionné pour moi. Pour ceux qui effectuent une recherche via Google: Définir PixelOffsetMode sur Half permet à graphics.DrawImage (...) de redimensionner une image (comme dans MS Paint) sans alias et remplit la taille/rectangle de destination avec ce que vous spécifiez. Ceci est utile si vous souhaitez superposer une image ou un motif de couleur unique lorsque vous ne vous souciez pas des artefacts/du fondu (parce que c'est une couleur unie, il n'y en aura pas). – Andrew

0

+0

J'ai essayé ceci, et il me donne un bitmap solide pour exactement la moitié de la largeur, puis rien. Les autres modes donnent une transparence variable après la moitié, mais InterpolationMode.NearestNeighbor ne dessine que 0.5 * wanted_width. – Nick

+0

Ce n'est pas vrai, cela doit être un problème ailleurs dans votre code. Je l'ai testé moi-même juste pour être sûr. Le mode d'interpolation n'a rien à voir avec la largeur de l'image dessinée. –

+0

Il le fait quand il n'y a rien d'autre dessiné. Vérifiez ci-dessous pour ma réponse, il a à voir avec le PixelOffset aussi bien. Il est facilement reproductible. Prenez n'importe quel contrôle, remplacez son événement OnPaint, dessinez une image 1px large pour toute la largeur, et il n'apparaîtra que 50% de large. Maintenant, définissez le PixelOffset, et il montre 100%. C'est avec Visual Studio 2010 et .NET 4.0 sur de nombreux contrôles différents, tous agissent de la même manière. – Nick