I noticed that half of the first pixel column of the image is not output after scaling the graphic transform in the OnPaint event.
All the code needed to play it is at the end of the message. I basically created a class derived from a PictureBox called PictureBox2, and it overrides the OnPaint method to perform scale conversion. It also changes InterpolationMode to NearestNeighbor to prevent the graphics from changing in pixels.
The PictureBox control has been added to Form6_GraphicsTest. The control is fixed on all sides. The color of the back of PictureBox2 was changed to blue, and the back color of the form was dark gray.
As you can see in the image below, only 1/2 of the first pixel of the image is drawn. Why? Am I missing something? 
Here is the original 10x10 8bpp image: 
EDIT Solution For some reason, ODD PixelOffsetMode.Default consumes 0.5 pixels. Solution: PixelOffsetMode.Half or HighQuality!
Code 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 } } }
Code 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; } }
c # image graphics transformation
Pedro77
source share