c# ग्राफ़िक्स ट्रांसफ़ॉर्म स्केल के बाद पहले पिक्सेल स्तंभ के आधा भाग लापता



image graphics (1)

मैंने देखा है कि छवि के पहले पिक्सेल कॉलम का आधा, ओपन पेंट पर ग्राफिक्स ट्रांसफ़ॉर्म स्केल के बाद नहीं लिया गया है।

पुन: उत्पन्न करने के लिए आवश्यक सभी कोड पोस्ट के अंत में है। असल में मैंने पिक्चरबॉक्स 2 नामक चित्र बॉक्स से प्राप्त एक क्लास बनाया है और यह स्केल परिवर्तन करने के लिए OnPaint विधि को ओवरराइड करता है। यह ग्राफिक्स को पिक्सेल को बदलने से रोकने के लिए निकटतम निकटतम में इंटरपोलेशन मोड को भी बदलता है

पिक्चरबॉक्स नियंत्रण फॉर्म 6_GraphicsTest नामक एक प्रपत्र में जोड़ा गया था नियंत्रण सभी पक्षों में लंगर किया जाता है। PictureBox2 बैक कलर को नीले रंग में बदल दिया गया था और प्रपत्र बैक रंग को गहरे भूरे रंग में बदल दिया गया था।

जैसा कि आप नीचे दी गई छवि पर देख सकते हैं, केवल छवि का पहला पिक्सेल स्तंभ का 1/2 तैयार होता है क्यूं कर?? क्या मुझसे कोई चूक हो रही है??

यहां मूल 10x10 8 बीपीपी छवि है:

संपादित करें - समाधान कुछ ओडीडी कारणों के लिए पिक्सलऑफ़सेटमॉड.डिफ़ॉल्ट 0.5 पिक्सेल ऊपर खाता है। समाधान: पिक्सलऑफ़सेटमॉड.हाफ या उच्च गुणवत्ता!

कोड चित्रबॉक्स 2 सीएएस

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
        }
    }
}

कोड फॉर्म 6_जीफ़िक्सटस्ट सीसीएस:

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;
    }
}

क्या यह पिक्सेलऑफ़सेटमोड से संबंधित हो सकता है? यह इस अन्य पोस्ट से संबंधित हो सकता है यह प्रतिपादन की दक्षता के साथ किया है ...