Resize e crop di un'immagine

venerdì 31 maggio 2013 - 13.21
Tag Elenco Tags  C#  |  .NET 4.0

svipla Profilo | Senior Member

Ciao a tutti
sono alla ricerca di una classe che crei immagini di una dimensione che scelgo io. Deve prima ridimensionare le foto e nel caso non siano, per esempio, 100x100 deve eseguire il crop. Il crop dev'essere eseguito al centro.

Ho trovato 2 esempio, però uno spesso mi lascia una linea nera su un bordo e non va bene perchè rovina l'immagine, l'altro mi esegue il crop in alto a sinistra e io lo voglio al centro.

grazie mille

Dev01 Profilo | Newbie

Ciao,
dovresti postare il codice che utilizzi o per lo meno tentare di individuare le coordinate coinvolte nel cropping che devono essere presenti nel codice per forza di cose anche sotto forma di operazione matematica.

Con un po di buona volontà la funzione per "centrare" la porzione d'immagine da copiare la scrivi con pochissimo sforzo perché si tratta di un'operazione estremamente banale tale che solo osservando un qualsiasi piano ci si possa arrivare.


01000100 01100101 01110110 00101101 00110000 00110001

Gemini Profilo | Expert

Ciao
alla ho trovato questa soluzione:

public static Image FixedSize(Image imgPhoto, int Width, int Height, bool needToFill) { int sourceWidth = imgPhoto.Width; int sourceHeight = imgPhoto.Height; int sourceX = 0; int sourceY = 0; int destX = 0; int destY = 0; float nPercent = 0; float nPercentW = 0; float nPercentH = 0; nPercentW = ((float)Width / (float)sourceWidth); nPercentH = ((float)Height / (float)sourceHeight); if (!needToFill) { if (nPercentH < nPercentW) { nPercent = nPercentH; } else { nPercent = nPercentW; } } else { if (nPercentH > nPercentW) { nPercent = nPercentH; destX = (int)Math.Round((Width - (sourceWidth * nPercent)) / 2); } else { nPercent = nPercentW; destY = (int)Math.Round((Height - (sourceHeight * nPercent)) / 2); } } if (nPercent > 1) nPercent = 1; int destWidth = (int)Math.Round(sourceWidth * nPercent); int destHeight = (int)Math.Round(sourceHeight * nPercent); System.Drawing.Bitmap bmPhoto = new System.Drawing.Bitmap( destWidth <= Width ? destWidth : Width, destHeight < Height ? destHeight : Height, PixelFormat.Format32bppRgb); //bmPhoto.SetResolution(imgPhoto.HorizontalResolution, // imgPhoto.VerticalResolution); System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto); grPhoto.Clear(System.Drawing.Color.White); grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic; //InterpolationMode.HighQualityBicubic; grPhoto.CompositingQuality = CompositingQuality.HighQuality; grPhoto.SmoothingMode = SmoothingMode.AntiAlias; grPhoto.DrawImage(imgPhoto, new System.Drawing.Rectangle(destX, destY, destWidth, destHeight), new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight), System.Drawing.GraphicsUnit.Pixel); grPhoto.Dispose(); return bmPhoto; }

Dev01 Profilo | Newbie

Int SourceX e Int SourceY rappresentano i punti di partenza di copia dell'immagine.

Se te ne necessita lo spostamento prova a modificarne il valore tale che sia sempre compreso tra 0 e ((image.width -1) - Width) per quanto riguarda SourceX e 0 e ((image.Height-1) - Height) per quanto riguarda SourceY.

Come si calcola la centratura?

Si decide una grandezza arbitraria per l'area da "croppare" tale che il valore sia sempre compreso tra i parametri su esposti e lo si suddivide in due (metà per parte).

Con i parametri ottenuti si ottiene il punto di partenza:

SourceX sarà uguale a Math.Floor(Image.Width / 2) / (CropWidth / 2) ' dove CropWidth è un parametro passato alla funzione;
SourceY sarà uguale a Math.Floor(Image.Height / 2) / (CropHeight / 2) ' vale il discorso precedente.

Math.Floor esegue un'arrotondamento all'intero immediatamente precedente per cui ti risolve il problema relativo l'elaborazione di un'immagine con larghezza dispari tale che il risultato dell'operazione, in caso di valori troppo grandi, possa rappresentare un punto esterno all'immagine stessa e impedendo, di fatto il sollevamento di un'eccezione di tipo OutOfRangeException; ovviamente necessita l'implementazione di tutti i controlli preventivi del caso.

I parametri Width e Height in ingresso alla funzione possono essere rappresentati e sostituiti rispettivamente da CropWidth (che imposterà la larghezza totale del crop) e CropHeight (che ne imposterà l'altezza).
01000100 01100101 01110110 00101101 00110000 00110001
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5