webForumDet fria alternativet

Skapa bitmap från graphics

.NET

5 svar · 441 visningar · startad av bwcMikke

Medlem sedan okt. 2004159 inlägg
Frågan#1

Jag försöker hitta det bästa sättet att minska storlek på en bild utan att tappa bildkvalitet. Har via diverse efterforskningar kommit fram till följande kodavsnitt:

gr.DrawImage(image, 0, 0, picWidth, picHeight);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
gr.Save();

Problemet nu är att funktionen skulle behöva returnera ett bitmap-objekt.
Jag hittar ingen method för att spara graphics i något annat format (ej heller Image eller Stream).
Är jag fel ute eller kan någon hjälpa till?

Medlem sedan dec. 19996 721 inlägg
#2

Du kan inte returnera en bitmap, men du kan instantiera Graphics från en bitmap, vilket gör att bitmapen uppdateras.

gr = Graphics.FromImage(bitmap);
Medlem sedan okt. 2004159 inlägg
#3

OK.
Om jag förstår det rätt så kan jag komplettera koden så den blir något i stil med:

System.Drawing.Image image = System.Drawing.Image.FromStream(stmInput);
					
Bitmap bmp = new Bitmap(picWidth, picHeight);
bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

Graphics gr = Graphics.FromImage(bmp);
gr.DrawImage(image, 0, 0, picWidth, picHeight);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

gr.Save();

return bmp;

image.Dispose();
bmp.Dispose();

och då skall bilden som finns i strInput få den nya storleken med absolut minsta kvalitetsförstöring?

Om kunden ändå inte är nöjd - vad gör man då?

Medlem sedan dec. 19996 721 inlägg
#4

Så här bör det nog se ut.

System.Drawing.Image image = System.Drawing.Image.FromStream(stmInput);
					
Bitmap bmp = new Bitmap(picWidth, picHeight);
bmp.SetResolution(image.HorizontalResolution, image.VerticalResolution);

Graphics gr = Graphics.FromImage(bmp);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubi  c;
gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
gr.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
gr.DrawImage(image, 0, 0, picWidth, picHeight);

gr.Save();

return bmp;

image.Dispose();
bmp.Dispose();
Medlem sedan okt. 2004159 inlägg
#5

Aha, jag förstår (tror jag)

Jag tycker resultatet verkar bättre - återstår bara att se om kunden tycker det också.

Tack så mycket !

Medlem sedan dec. 19996 721 inlägg
#6

bwcMikke skrev:

Aha, jag förstår (tror jag)

Jag tycker resultatet verkar bättre - återstår bara att se om kunden tycker det också.

Tack så mycket !

Kanon. Anledningen till att det blir bättre är, som du kanske förstår, att de inställningar som görs på Graphic-objektet appliceras vid DrawImage. Efter det är det för sent.

Btw, var det inte mitt svar som löste problemet? ;)

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)