Domanda

Ho scritto un metodo per ritagliare le immagini in C #. Lo fa creando una nuova Bitmap e disegnando su di essa un rettangolo specificato (l'area da ritagliare) dall'immagine originale.

Per le immagini che ho provato con esso stava generando risultati sbagliati. La dimensione dell'immagine risultante era corretta, ma il contenuto era. Era come se l'immagine fosse stata ingrandita di 2 e poi ritagliata. Alla fine l'aggiunta di questa riga l'ha risolto:

result.setResolution(72, 72)

Ma perché ho bisogno di una risoluzione? Sto solo lavorando con pixel, mai con pollici o centimetri. Inoltre, quale sarebbe la risoluzione corretta?

Il codice completo è questo metodo di estensione:

public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
    Bitmap result = new Bitmap(width, height);
    result.SetResolution(72, 72);

    // Use a graphics object to draw the resized image into the bitmap.
    using (Graphics graphics = Graphics.FromImage(result)) {
        // High quality.
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        // Draw the image into the target bitmap.
        graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
    }

    return result;
}
È stato utile?

Soluzione

Stai utilizzando il sovraccarico errato di DrawImage. Dovresti usare quello in cui specifichi i rect Src e Dest.

graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

Provalo e fammi sapere nei commenti se non funziona.

Altri suggerimenti

Sospetto che la risposta risieda nel modo in cui la libreria effettua la modifica. semplicemente copia e incolla alcuni blocchi di memoria. la risoluzione specifica il numero di bit / byte utilizzati per pixel. per sapere quanti byte deve copiare, deve sapere quanti bit / byte per pixel vengono utilizzati.

quindi penso che questa sia una semplice moltiplicazione seguita da una memcopia.

Per quanto riguarda

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top