Comment rééchantillonner une image en carré, un remplissage avec un fond blanc en C# est préférable sans utiliser de bibliothèque tierce (framework .Net uniquement)?Faire une image carrée
Merci!
Comment rééchantillonner une image en carré, un remplissage avec un fond blanc en C# est préférable sans utiliser de bibliothèque tierce (framework .Net uniquement)?Faire une image carrée
Merci!
Cela peut effectivement être fait assez facilement.
public static Image PadImage(Image originalImage)
{
int largestDimension = Math.Max(originalImage.Height, originalImage.Width);
Size squareSize = new Size(largestDimension, largestDimension);
Bitmap squareImage = new Bitmap(squareSize.Width, squareSize.Height);
using (Graphics graphics = Graphics.FromImage(squareImage))
{
graphics.FillRectangle(Brushes.White, 0, 0, squareSize.Width, squareSize.Height);
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.DrawImage(originalImage, (squareSize.Width/2) - (originalImage.Width/2), (squareSize.Height/2) - (originalImage.Height/2), originalImage.Width, originalImage.Height);
}
return squareImage;
}
Je sais que c'est un vieux post, mais c'est toujours utile. J'ai utilisé le Math.Min pour recadrer mes images afin d'obtenir une vignette. Fonctionne parfaitement! – AntLaC
Essayez d'utiliser cette méthode. Le dernier argument est un commutateur pour savoir si vous souhaitez étirer l'image pour s'adapter. Si faux, l'image est centrée dans la nouvelle toile blanche. Vous pouvez lui donner une taille carrée ou non car nécessaire.
public static Bitmap ResizeBitmapOnWhiteCanvas(Bitmap bmpOriginal, Size szTarget, bool Stretch)
{
Bitmap result = new Bitmap(szTarget.Width, szTarget.Height);
using (Graphics g = Graphics.FromImage((Image)result))
{
g.InterpolationMode = InterpolationMode.NearestNeighbor;
g.FillRectangle(Brushes.White, new Rectangle(0, 0, szTarget.Width, szTarget.Height));
if (Stretch)
{
g.DrawImage(bmpOriginal, 0, 0, szTarget.Width, szTarget.Height); // fills the square (stretch)
}
else
{
float OriginalAR = bmpOriginal.Width/bmpOriginal.Height;
float TargetAR = szTarget.Width/szTarget.Height;
if (OriginalAR >= TargetAR)
{
// Original is wider than target
float X = 0F;
float Y = ((float)szTarget.Height/2F) - ((float)szTarget.Width/(float)bmpOriginal.Width * (float)bmpOriginal.Height)/2F;
float Width = szTarget.Width;
float Height = (float)szTarget.Width/(float)bmpOriginal.Width * (float)bmpOriginal.Height;
g.DrawImage(bmpOriginal, X, Y, Width, Height);
}
else
{
// Original is narrower than target
float X = ((float)szTarget.Width/2F) - ((float)szTarget.Height/(float)bmpOriginal.Height * (float)bmpOriginal.Width)/2F;
float Y = 0F;
float Width = (float)szTarget.Height/(float)bmpOriginal.Height * (float)bmpOriginal.Width;
float Height = szTarget.Height;
g.DrawImage(bmpOriginal, X, Y, Width, Height);
}
}
}
return result;
}
Vous ne dites pas comment vous voulez rembourré. En supposant que vous voulez que l'image centrée, avec le nom du fichier image dans ImageFileName et le nom du fichier de sortie souhaité dans NewFileName:
Bitmap orig = new Bitmap(imageFileName);
int dim = Math.Max(orig.Width, orig.Height);
Bitmap dest;
using (Graphics origG = Graphics.FromImage(orig))
{
dest = new Bitmap(dim, dim, origG);
}
using (Graphics g = Graphics.FromImage(dest))
{
Pen white = new Pen(Color.White, 22);
g.FillRectangle(new SolidBrush(Color.White), 0, 0, dim, dim);
g.DrawImage(orig, new Point((dim - orig.Width)/2, (dim - orig.Height)/2));
}
dest.Save(newFileName);
Voulez-vous adapter à la nouvelle image rééchantillonnée dans un carré avec une toile blanche que l'image conserve son rapport d'aspect, ou d'étirer pour l'adapter à la place (faisant la toile blanche de type inutile)? – JYelton
je veux conserver le rapport d'aspect - pas d'étirement –
@ MichaelD.aren't ceux incompatibles? La quadrature modifie le rapport d'aspect. Ou est-ce que l'écrêtage de l'image est acceptable? – kenny