Często tworząc aplikację, która musi wyświetlać obrazki wybrane przez użytkownika stajemy przed problemem związanym z różnymi proporcjami zdjęć, a co za tym idzie różną wielkością wygenerowanych miniaturek, które trzeba później odpowiednio “pozycjonować” za pomocą styli CSS. Rozwiązaniem tego problemu jest generowanie miniaturek stałej wielkości.
Do dzieła!
Co musimy zrobić, żeby wygenerować taką miniaturkę? To proste wystarczy wyskalować obrazek do wielkości jaka nas interesuje i następnie nałożyć na środku obrazka ze stałym tłem (np. białym) o docelowej wielkości.
Pierwszą rzeczą, która musimy zrobić jest obliczenie rozmiarów po skalowaniu naszego obrazka:
// obliczamy proporcje szerokości obrazka do szerokości docelowej oraz wysokości obrazka do wysokości docelowej i wybieramy mniejszą double ratio = Math.Min((double)dstImageWidth / (double)image.Width, (double)dstImageHeight / (double)image.Height); // obliczamy nową szerokość i wysokość obrazka int scaledWidth = (int)Math.Round(image.Width * ratio); int scaledHeight = (int)Math.Round(image.Height * ratio);
Następną rzeczą, którą musimy wykonać jest obliczenie miejsca, od którego zaczniemy rysowanie obrazka na obrazku docelowym:
int x = dstImageWidth / 2 - scaledWidth / 2; int y = dstImageHeight / 2 - scaledHeight / 2;
Powyższy kod obliczy nam punkt przesunięty o połowę wysokości i szerokości naszego obrazka od środka obrazka docelowego.
Ostatnim etapem jest stworzenie obrazka docelowego o pożądanych rozmiarach, wypełnienie go stałym tłem i narysowanie na nim wyskalowanego obrazka i następnie zapisujemy miniaturkę do pliku:
using (Bitmap outBitmap = new Bitmap(dstImageWidth, dstImageHeight, PixelFormat.Format24bppRgb))
using (Graphics graphics = Graphics.FromImage(outBitmap))
{
// ustawiamy typ wygładzania i interpolacji przy skalowaniu
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.High;
graphics.FillRectangle(Brushes.White, graphics.ClipBounds);
graphics.DrawImage(image, x, y, scaledWidth, scaledHeight);
outBitmap.Save(thumbFileName, ImageFormat.Jpeg);
}
Musimy pamiętać, także o zaimportowaniu odpowiednich przestrzeni nazw:
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging;
Pełny kod metody znajduje się poniżej:
private void GenerateThumb(Bitmap image, int dstImageWidth, int dstImageHeight, string thumbFileName)
{
double ratio = Math.Min((double)dstImageWidth / (double)image.Width, (double)dstImageHeight / (double)image.Height);
int scaledWidth = (int)Math.Round(image.Width * ratio);
int scaledHeight = (int)Math.Round(image.Height * ratio);
int x = dstImageWidth / 2 - scaledWidth / 2;
int y = dstImageHeight / 2 - scaledHeight / 2;
using (Bitmap outBitmap = new Bitmap(dstImageWidth, dstImageHeight, PixelFormat.Format24bppRgb))
using (Graphics graphics = Graphics.FromImage(outBitmap))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.High;
graphics.FillRectangle(Brushes.White, graphics.ClipBounds);
graphics.DrawImage(image, x, y, scaledWidth, scaledHeight);
outBitmap.Save(thumbFileName, ImageFormat.Jpeg);
}
}
1 Komentarze.