c# image gdi+ image-resizing

c# - Imagen de tamaño de dibujo demasiado pequeña



gdi+ image-resizing (1)

El problema ocurre cuando se escala a 2x o más.

Parece que todo el problema está causado por un PixelOffsetMode predeterminado PixelOffsetMode .

Al compensar los píxeles durante el procesamiento, puede mejorar la calidad de procesamiento a costa de la velocidad de procesamiento.

Configurándolo para

g.PixelOffsetMode = PixelOffsetMode.Half;

hace que se vaya para mí.

Configurándolo para

g.PixelOffsetMode = PixelOffsetMode.HighQuality;

También funciona bien.

Default , None y HighSpeed hacen que la imagen se renderice un poco hacia la izquierda y hacia arriba.

A menudo, también querrá establecer InterpolationMode.NearestNeighbor .

Cuando dibujo una imagen con Graphics.DrawImage y la dibujo en un tamaño más grande que la imagen original, termina siendo un poco demasiado pequeño. Puedes ver esto en la siguiente imagen:

Las líneas verdes no deberían ser visibles y no forman parte de la imagen. Más bien se dibujan detrás de la imagen y la imagen debe cubrirlos.

¿Cómo puedo dibujar una imagen con el tamaño exacto correcto?

EDITAR : dibujo la parte verde con el mismo rectángulo que paso en la llamada DrawImage , con las dimensiones exactas de cuán grande debe ser la imagen. Así que no hay defecto en mis valores (creo).

EDITAR 2 : dibujo el rectángulo verde con FillRectangle , por lo que no es necesario realizar cálculos con el lápiz. Además, anoté los valores que paso en el rectángulo tanto para la imagen como para el relleno verde, y los valores son correctos. Es solo la imagen que está apagada. Publicaré el código más tarde, ya que no estoy en mi computadora en este momento.

EDIT 3 : Este es el código que utilizo para renderizar las imágenes:

// This is for zooming public readonly float[] SCALES = { 0.05f, 0.1f, 0.125f, 0.25f, 0.333f, 0.5f, 0.667f, 0.75f, 1.0f, 1.25f, 1.5f, 1.75f, 2.0f, 2.5f, 3.0f, 3.5f, 4.0f, 4.5f, 5.0f, 6.0f, 7.0f, 8.0f, 10.0f, 12.0f, 15.0f, 20.0f, 30.0f, 36.0f }; private int scaleIndex = 8; protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); float ScaleFactor = SCALES[scaleIndex]; e.Graphics.InterpolationMode = ScaleFactor < 1 ? InterpolationMode.Bicubic : InterpolationMode.NearestNeighbor; Image im = Properties.Resources.TSprite0; for (int y = 0; y < TilesVertical; y++) { for (int x = 0; x < TilesHorizontal; x++) { float sx = im.Width * ScaleFactor; float sy = im.Height * ScaleFactor; Point p = new Point((int)(-scrollPosition.X + sx * x), (int)(-scrollPosition.Y + sy * y)); Size s = new Size((int)Math.Floor(sx), (int)Math.Floor(sy)); // The green rectangle in the background should be the same size as the image e.Graphics.FillRectangle(Brushes.Lime, new Rectangle(p, s)); e.Graphics.DrawImage(im, new Rectangle(p, s), 0, 0, 16, 16, GraphicsUnit.Pixel); } } im.Dispose(); }

EDIT 4 : también tenga en cuenta que la imagen parece estar recortada a la izquierda y arriba en lugar de cambiar el tamaño. Eche un vistazo a esta comparación de la imagen original aumentada en Photoshop y luego cómo GDI + la presenta: