visual una tamaño studio sharp redimensionar recortar net modificar imagenes imagen editar como cambiar asp ampliar c# image graphics transformation

c# - tamaño - Falta la mitad de la primera columna de píxeles después de una escala de transformación de gráficos



recortar imagen c sharp (1)

¿Podría estar relacionado con PixelOffsetMode ? Esto podría estar relacionado con esta otra publicación . Tiene que ver con la eficiencia de la renderización ...

Me di cuenta de que la mitad de la primera columna de píxeles de la imagen no se dibuja después de una escala de transformación de gráficos en el evento OnPaint.

Todo el código necesario para reproducirlo se encuentra al final de la publicación. Básicamente, he creado una clase derivada de PictureBox llamada PictureBox2 y reemplaza el método OnPaint para realizar la transformación de escala. También cambia el Modo de interpolación a NearestNeighbor para evitar que los gráficos cambien el aspecto de los píxeles.

El control PictureBox se agregó a un Formulario llamado Form6_GraphicsTest. El control está anclado en todos los lados. El color de fondo de PictureBox2 se cambió a azul y el color de la parte posterior a gris oscuro.

Como puede ver en la imagen a continuación, solo se dibuja 1/2 de la primera columna de píxeles de la imagen. ¿¿Por qué?? ¿¿Me estoy perdiendo de algo??

Aquí está la imagen original de 10x10 8bpp:

EDITAR - Solución Por alguna razón ODD PixelOffsetMode.Default consume hasta 0.5 píxeles. Solución: PixelOffsetMode.Half o HighQuality!

Código PictureBox2.cs

using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace GraphicsTest { public class PictureBox2 : PictureBox { public PointF Zoom = new PointF(20, 20); private InterpolationMode interpolationMode = InterpolationMode.NearestNeighbor; /// <summary> /// Paint the image /// </summary> /// <param name="e">The paint event</param> protected override void OnPaint(PaintEventArgs e) { if (IsDisposed) return; if (Image != null) { if (e.Graphics.InterpolationMode != interpolationMode) e.Graphics.InterpolationMode = interpolationMode; using (Matrix transform = e.Graphics.Transform) { //e.Graphics.ResetTransform(); if (Zoom.X != 1.0 || Zoom.Y != 1.0) transform.Scale(Zoom.X, Zoom.Y, MatrixOrder.Append); //if (ImageDisplayLocation.X != 0 || ImageDisplayLocation.Y != 0) //Convert translation back to display pixel unit. // transform.Translate(ImageDisplayLocation.X / Zoom.X, ImageDisplayLocation.Y / Zoom.Y); e.Graphics.Transform = transform; } } base.OnPaint(e); //If you want to draw something over the control in control coordinate, you must first reset the transformation! :D //e.Graphics.ResetTransform(); //Draw your stuff } } }

Código Form6_GraphicsTest.cs:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace GraphicsTest { public class Form6_GraphicsTest : Form { public Form6_GraphicsTest() { InitializeComponent(); Bitmap bmp = new Bitmap(@"D:/Test 10x10.8bpp.png"); this.pictureBox21.Image = bmp; this.pictureBox21.Zoom = new PointF(20,20); this.ClientSize = new Size(Convert.ToInt32(this.pictureBox21.Zoom.X * bmp.Width) + 30, Convert.ToInt32(this.pictureBox21.Zoom.Y * bmp.Height) + 30); } /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.pictureBox21 = new GraphicsTest.PictureBox2(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).BeginInit(); this.SuspendLayout(); // // pictureBox21 // this.pictureBox21.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.pictureBox21.BackColor = System.Drawing.SystemColors.Highlight; this.pictureBox21.Location = new System.Drawing.Point(12, 12); this.pictureBox21.Name = "pictureBox21"; this.pictureBox21.Size = new System.Drawing.Size(260, 238); this.pictureBox21.TabIndex = 0; this.pictureBox21.TabStop = false; // // Form6_GraphicsTest // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.SystemColors.ControlDarkDark; this.ClientSize = new System.Drawing.Size(284, 262); this.Controls.Add(this.pictureBox21); this.Name = "Form6_GraphicsTest"; this.Text = "Form6_GraphicsTest"; ((System.ComponentModel.ISupportInitialize)(this.pictureBox21)).EndInit(); this.ResumeLayout(false); } #endregion private PictureBox2 pictureBox21; } }