2011-08-26 5 views
1

J'écris quelque chose pour créer de petits aperçus bitmap à partir d'un fichier au format vectoriel. A partir du fichier, j'ai une (grande) liste de coordonnées de ligne. Ce que je veux faire, c'est l'adapter à une image de largeur fixe (96x96). J'avais auparavant dessiné l'image bitmap en taille réelle et je l'ai juste redimensionnée en 96x96, mais comme les vignettes devaient être créées à la volée, elles ne sont pas assez rapides (et c'était une façon vraiment stupide de le faire dans le premier endroit!). Maintenant, je veux juste mettre à l'échelle toutes les coordonnées comme si la taille originale était 96x96, laisser tomber tous les points qui se dessinent les uns sur les autres et cela devrait augmenter considérablement les performances.Scaling graphique C#/GDI (Drawline)

Je suis un débutant absolu avec tout et n'importe quoi .NET Graphics/GDI et la première version était assez simple (code ci-dessous). Je me demande s'il y a quelque chose dans la bibliothèque graphique (ou ailleurs) qui le fait sans que je doive parcourir tous les points et faire le calcul sur chacun d'entre eux.

Un gourou graphique/GDI peut-il me diriger dans la bonne direction (ou laissez-moi savoir qu'il n'y a pas de direction)? J'utilise C# et la cible du framework .NET est OK.

Jusqu'à présent, il est assez simple (tmpblocks est un tableau de points):

Bitmap DrawArea; 
Graphics xGraph; 

DrawArea = new Bitmap(64, 64); 
// ^- this is GetWidth() and GetHeight() when drawing the full file at full size 

xGraph = Graphics.FromImage(DrawArea); 

for (int i = 0; i < tmpblocks.Count; i++) 
{ 
if (tmpblocks[i].stitches.Length > 1) 
{ 
Pen tempPen = new Pen(tmpblocks[i].color, 1.0f); 
tempPen.StartCap = System.Drawing.Drawing2D.LineCap.Round; 
tempPen.EndCap = System.Drawing.Drawing2D.LineCap.Round; 
tempPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Round; 
xGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
xGraph.DrawLines(tempPen, tmpblocks[i].stitches); 
} 
} 

Pour la miniature que je venais de l'échelle de la bitmap résultante en utilisant la méthode .GetThumbnail. Vraiment lent, bien que (évidemment) ...

Répondre

1

Vous pouvez utiliser le Graphics.ScaleTransform(float sx, float sy) pour accomplir ceci.

Vous pouvez obtenir de sx: targetWidth/SourceWidth et Sy: targetHeight/SourceHeight

où la cible est définie par votre taille de l'image cible, et la source est votre taille de l'image source.

+0

Je l'ai vu et essayé, mais tout ce que je reçois est un BMP blanc avec quelques lignes dans le coin .. – user802084

+0

Ah, on dirait que je vais devoir utiliser TranslateTransform ... – user802084

+0

Je ne sais pas pourquoi vous aurait besoin d'utiliser translate transformer, à moins qu'il y ait d'autres différences de système de coordonnées entre le fichier vectoriel et le périphérique graphique, c'est-à-dire vers quelle direction y pointe. Cependant, si cette réponse a aidé, je serais très obligé de le marquer comme étant répondu. – Mranz