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);
5 svar · 441 visningar · startad av bwcMikke
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?
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);
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å?
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();
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 !
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? ;)