Fehlende Hälfte der ersten Pixelspalte nach einer Grafik-Transformationsskala

Ich habe festgestellt, dass die Hälfte der ersten Pixelspalte des Bildes nicht nach einer Graphics-Transformations-Skala im OnPaint-Ereignis gezeichnet wird.

Der gesamte zur Reproduktion erforderliche Code befindet sich am Ende des Beitrags. Grundsätzlich habe ich eine von PictureBox abgeleitete class mit dem Namen PictureBox2 erstellt und überschreibt die OnPaint-Methode zum Durchführen der Scale-Umwandlung. Außerdem wird der InterpolationMode in NearestNeighbor geändert, um zu verhindern, dass Graphics das Aussehen der Pixel ändert.

Das PictureBox-Steuerelement wurde zu einem Formular namens Form6_GraphicsTest hinzugefügt. Die Steuerung ist an allen Seiten verankert. Die PictureBox2-Hintergrundfarbe wurde in Blau und die Form-Hintergrundfarbe in Dunkelgrau geändert.

Wie Sie auf dem Bild unten sehen können, wird nur die Hälfte der ersten Pixelspalte des Bildes gezeichnet. Warum?? Fehlt mir hier etwas? Fehlender 1/2 Pixel Grafikfehler

Hier ist das Originalbild 10×10 8bpp: 10x10 8bpp Testbild

EDIT – Lösung Aus einigen ODD-Gründen frisst PixelOffsetMode.Default 0,5 Pixel. Lösung: PixelOffsetMode.Half oder 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; ///  /// Paint the image ///  /// The paint event 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); } ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  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; } } 

    Könnte es mit PixelOffsetMode zusammenhängen ? Dies könnte mit diesem anderen Beitrag zusammenhängen . Es hat mit Effizienz beim Rendern zu tun …