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: