7. Oktober 2011

[dotnet] Image korrekt skalieren

Es ist mir aufgefallen, dass zeitweise Bilder, die mittels DrawImageUnscaled gezeichnet werden zeitweise nicht wirklich den tatsächlichen Bildmaßen entsprechen o.O

Nicht immer, einige Bilder werden korrekt gezeichnet, andere nicht?
Folgender Code [C#] sollte ein Bild in seiner ursprünglichen Größe (unscaled) zeichnen:


// Load the image and determine new dimensions
System.Drawing.Image img = System.Drawing.Image.FromFile(srcFilePath);
Size szDimensions = new Size(GetNextPwr2(img.Width), GetNextPwr2(img.Height));
// Create blank canvas
Bitmap resizedImg = new Bitmap(szDimensions.Width, szDimensions.Height);
Graphics gfx = Graphics.FromImage(resizedImg);
// Paste source image on blank canvas, then save it as .png
gfx.DrawImageUnscaled(img, 0, 0);
resizedImg.Save(newFilePath, System.Drawing.Imaging.ImageFormat.Png);


Doch tatsächlich ist das gezeichnete Bild ein wenig größer als die Ursprungsdatei... und verschwommen.

Nun bin ich der Sache mal auf den Grund gegangen und auf Folgendes gestoßen:
The method DrawImageUnscaled doesn't draw the image at the original pizel size, instead it uses the resolution (pixels per inch) of the source and destination images to scale the image so that it's drawn with the same physical dimensions. - Link

Tatsächlich :-o
Abhängig von der Auflösung des Bildes resultiert eine andere Größe beim zeichnen mit DrawImageUnscaled!

Die Lösung sieht folgendermaßen aus:
Anstatt das Bild direkt mit der Grafikmethode unskaliert zu zeichnen,
zeichne ich es nun mit angegebenen Maßen... denen des Bildes :)

Das würde in C# so aussehen:


gfx.DrawImage(img, 0, 0, img.Width, img.Height);



Soooo, damit sind wir wieder einem .net Rätsel auf die Spur gekommen ;)

happy coding
- the incredible Leitman