Pregunta

Escribí un método para recortar imágenes en C #. Lo hace creando un nuevo mapa de bits y dibujando en él un rectángulo específico (el área que se va a recortar) de la imagen original.

Para las imágenes con las que he intentado, generaba resultados erróneos. El tamaño de la imagen resultante era correcto, pero el contenido era el correcto. Era como si la imagen hubiera sido ampliada en 2 y luego recortada. Eventualmente agregando esta línea lo arregló:

result.setResolution(72, 72)

¿Pero por qué necesito una resolución? Solo estoy trabajando con píxeles, nunca con pulgadas o centímetros. Además, ¿cuál sería la resolución correcta?

El código completo es este método de extensión:

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;
}
¿Fue útil?

Solución

Está utilizando la sobrecarga incorrecta de DrawImage. Debería estar utilizando el que especifique los códigos Src y Dest.

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

Inténtalo y hazme saber en los comentarios si no funciona.

Otros consejos

sospecho que la respuesta está en la forma en que la biblioteca realiza la modificación. solo copia y pega unos bloques de memoria. La resolución especifica el número de bits / bytes utilizados por píxel. para saber cuántos bytes necesita copiar, necesita saber cuántos bits / bytes se utilizan por píxel.

por lo tanto, creo que esta es una simple multiplicación seguida de una copia.

saludos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top