Libreria di scalatura di immagini di alta qualità

Voglio ridimensionare un’immagine in C # con un livello di qualità buono come Photoshop. È disponibile una libreria di elaborazione delle immagini C # per fare questa cosa?

Quando si disegna l’immagine usando GDI +, la scala è abbastanza buona secondo me. Puoi usarlo per creare un’immagine in scala.

Se vuoi ridimensionare l’immagine con GDI + puoi fare qualcosa del genere:

 Bitmap original = ... Bitmap scaled = new Bitmap(new Size(original.Width * 4, original.Height * 4)); using (Graphics graphics = Graphics.FromImage(scaled)) { graphics.DrawImage(original, new Rectangle(0, 0, scaled.Width, scaled.Height)); } 

Librerie testate come Imagemagick e GD sono disponibili per .NET

Puoi anche leggere cose come l’interpolazione bicubica e scrivere la tua.

Articoli CodeProject che discutono e condividono il codice sorgente per ridimensionare le immagini:

  • Ridimensionamento a due passaggi utilizzando i filtri
  • Trasformazione delle matrici di immagini in C #, usando .NET GDI +
  • Ridimensionamento di un’immagine fotografica con GDI + per .NET
  • Ridimensionamento di un’immagine diadica veloce con Haar Transform

Usa questa libreria: http://imageresizing.net

Leggi l’articolo dell’autore della biblioteca: 20 Problemi di dimensionamento dell’immagine con .NET

Prova i diversi valori per Graphics.InterpolationMode. Esistono diversi algoritmi di ridimensionamento tipici disponibili in GDI +. Se uno di questi è sufficiente per le tue necessità, puoi seguire questa rotta invece di fare affidamento su una libreria esterna.

Puoi provare dotImage , uno dei prodotti della mia azienda, che include un object per ricampionare le immagini che ha 18 tipi di filtro per vari livelli di qualità.

L’utilizzo tipico è:

 // BiCubic is one technique available in PhotoShop ResampleCommand resampler = new ResampleCommand(newSize, ResampleMethod.BiCubic); AtalaImage newImage = resampler.Apply(oldImage).Image; 

inoltre, dotImage include 140 alcuni strani comandi per l’elaborazione delle immagini, inclusi molti filtri simili a quelli di PhotoShop, se è quello che stai cercando.

Questo potrebbe aiutare

  public Image ResizeImage(Image source, RectangleF destinationBounds) { RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height); RectangleF scaleBounds = new RectangleF(); Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height); Graphics graph = Graphics.FromImage(destinationImage); graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // Fill with background color graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds); float resizeRatio, sourceRatio; float scaleWidth, scaleHeight; sourceRatio = (float)source.Width / (float)source.Height; if (sourceRatio >= 1.0f) { //landscape resizeRatio = destinationBounds.Width / sourceBounds.Width; scaleWidth = destinationBounds.Width; scaleHeight = sourceBounds.Height * resizeRatio; float trimValue = destinationBounds.Height - scaleHeight; graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight); } else { //portrait resizeRatio = destinationBounds.Height/sourceBounds.Height; scaleWidth = sourceBounds.Width * resizeRatio; scaleHeight = destinationBounds.Height; float trimValue = destinationBounds.Width - scaleWidth; graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height); } return destinationImage; } 

Nota InterpolationMode.HighQualityBicubic -> questo è generalmente un buon compromesso tra prestazioni e risultati.

Prova questo frammento di codice di base:

 private static Bitmap ResizeBitmap(Bitmap srcbmp, int width, int height ) { Bitmap newimage = new Bitmap(width, height); using (Graphics g = Graphics.FromImage(newimage)) g.DrawImage(srcbmp, 0, 0, width, height); return newimage; } 

C’è un articolo su Code Project sull’uso di GDI + per .NET per il ridimensionamento delle foto usando, per esempio, l’interpolazione bicubica.

C’era anche un altro articolo su questo argomento su un altro blog (dipendente MS, credo), ma non riesco a trovare il collegamento da nessuna parte. 🙁 Forse qualcun altro può trovarlo?

potresti provare questo se si tratta di un filtro immagine 2D cgi lowres

Questo è un articolo che ho notato facendo riferimento al codice Paint.NET per il ricampionamento di immagini: varie tecniche di elaborazione di immagini semplici di Paul Bourke.

Potresti provare il kernel magico . Produce meno artefatti di pixel rispetto al ricampionamento bicubico durante l’upscaling e fornisce anche ottimi risultati durante il downscaling. Il codice sorgente è disponibile in c # dal sito web.

Ho qualche miglioramento per la risposta del dottor Jones.

Funziona per chi voleva come ridimensionare proporzionalmente l’immagine. Ha testato e ha funzionato per me.

I metodi di class I aggiunti:

 public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, Size size) { return ResizeImage(image, size.Width, size.Height); } public static Size GetProportionedSize(Image image, int maxWidth, int maxHeight, bool withProportion) { if (withProportion) { double sourceWidth = image.Width; double sourceHeight = image.Height; if (sourceWidth < maxWidth && sourceHeight < maxHeight) { maxWidth = (int)sourceWidth; maxHeight = (int)sourceHeight; } else { double aspect = sourceHeight / sourceWidth; if (sourceWidth < sourceHeight) { maxWidth = Convert.ToInt32(Math.Round((maxHeight / aspect), 0)); } else { maxHeight = Convert.ToInt32(Math.Round((maxWidth * aspect), 0)); } } } return new Size(maxWidth, maxHeight); } 

e nuovi disponibili utilizzando secondo questo codice:

 using (var resized = ImageUtilities.ResizeImage(image, ImageUtilities.GetProportionedSize(image, 50, 100))) { ImageUtilities.SaveJpeg(@"C:\myimage.jpeg", resized, 90); }