উইন্ডোজ ফর্মগুলিতে একটি একক পিক্সেল আঁকুন


94

আমি একটি উইন্ডোজ ফর্মের একটি একক পিক্সেল চালু করার চেষ্টা আটকে আছি।

graphics.DrawLine(Pens.Black, 50, 50, 51, 50); // draws two pixels

graphics.DrawLine(Pens.Black, 50, 50, 50, 50); // draws no pixels

এক পিক্সেলের রঙ নির্ধারণের জন্য সত্যিকার অর্থে এপিআইয়ের একটি পদ্ধতি থাকা উচিত, তবে আমি একটিও দেখছি না।

আমি সি # ব্যবহার করছি।


আমি একটি নিয়ন্ত্রণ তৈরি করেছিলাম যা কিছু খুব সুন্দর বৈজ্ঞানিক গ্রাফ প্লট করে (অতিরিক্ত দক্ষতার সাথে আমার কোনও বাণিজ্যিক নিয়ন্ত্রণের প্রয়োজন নেই)। আমি এবং এক্স বা একটি + বা একটি ছোট বাক্স দিয়ে ডেটা পয়েন্ট প্লট করতে পারি। তবে গুরুত্বহীন তথ্যের জন্য আমি কেবল একটি একক পিক্সেল চাই।
টি

আমি যে সমস্ত উত্তর দেখেছি তা দেখে মনে হচ্ছে এগুলি সত্যই কোনও এক পিক্সেলের জন্য ওভারকিল করছে? কেবল বাফার করা কেন সহজ মনে হচ্ছে [y * প্রস্থ + x] = রঙ;
NoMoreZealots

উত্তর:


114

এটি একটি একক পিক্সেল সেট করবে:

e.Graphics.FillRectangle(aBrush, x, y, 1, 1);

18
কে অনুমান করতে পারে যে ড্রআরেক্টাঙ্গেল 2x2 আঁকে তবে ফিলারেক্টঞ্জ একই যুক্তি দিয়ে 1x1 আঁকবে? ধন্যবাদ
টি

9
@ মার্ক: এটি এক ধরণের অর্থবোধ তৈরি করে ... অঙ্করেক্টাঙ্গেল বলেছে "এই প্রস্থ এবং উচ্চতার x এবং y দিয়ে শুরু করে একটি রূপরেখা আঁকুন", সুতরাং এটি শুরু এবং শেষের উভয় বিন্দু আঁকবে (x, y; x + 1, y ; x, y + 1; x + 1, y + 1) এবং তাদের মধ্যে লাইন। ফিলআরেক্টাঙ্গেল বলেছে "এই প্রস্থ এবং উচ্চতার x, y থেকে শুরু করে একটি শক্ত পৃষ্ঠ আঁকুন।" ঘটনাক্রমে, ফিলারেক্টেঙ্গেল ব্রাশ নেয়, কলম নয় takes
পাওয়ারলর্ড

4
@ আর। বেমরোজ: প্রকৃতপক্ষে, এটি আপনি যে কলম বস্তুটি পাস করেছেন তার উপর নির্ভর করে DrawRectangle()। যদি এটি থাকে তবে প্রদত্ত আয়তক্ষেত্রটির চারদিকে পিক্সেল ঘন রূপরেখা Pen.Alignment = PenAlignment.Outsetআঁকবে Pen.Width। তবে আপনি যদি নির্দিষ্ট Pen.Alignment = PenAlignment.Insetকরে থাকেন তবে প্রদত্ত আয়তক্ষেত্রের ভিতরে Pen.Width পিক্সেল পুরু "আউটলাইন" আঁকবে।
সিপি

4
এটি একটি খুব অসন্তুষ্ট উত্তর। যদিও এটি একটি একক পিক্সেল সেট করে, প্রয়োজনটি আক্ষরিক পিক্সেল সেট করা সবসময় হয় না। আমার যতবার এটি প্রয়োজন হয়েছে, যা প্রায়শই, আমি একই পেনটি আঁকতে বিন্দুটি দরকার যা লাইনগুলি ব্রাশ দিয়ে আঁকানো হয় না। অন্য কথায়, আমাদের একটি লাইন প্রয়োজন যা 2 পিক্সেলের চেয়ে কম is আমার সন্দেহ হয় ওপি-র প্রয়োজন ছিল এটিই।
রবার্টটি

6
আমি এই উত্তর পছন্দ করি না। এই উপায়টি অত্যন্ত অদক্ষ।
ব্যবহারকারী 626528

19

হেনক হলটারম্যান উত্তরের জন্য কেবল সম্পূর্ণ কোডটি দেখানোর জন্য:

Brush aBrush = (Brush)Brushes.Black;
Graphics g = this.CreateGraphics();

g.FillRectangle(aBrush, x, y, 1, 1);

18

Graphicsবস্তু এই যেহেতু এটি একটি বিমূর্ততা এবং একটি ভেক্টর গ্রাফিক্স বিন্যাস আবরণ ব্যবহার করা যেতে পারে নেই। সেই প্রসঙ্গে, একটি একক পিক্সেল সেট করার অর্থ হবে না। Bitmapইমেজ ফরম্যাট আছে GetPixel()এবংSetPixel() , কিন্তু একটি গ্রাফিক্স এক নির্মিত বস্তু। আপনার দৃশ্যের জন্য, আপনার বিকল্পটি কেবলমাত্র একটির মতোই মনে হচ্ছে কারণ সাধারণ গ্রাফিক্স অবজেক্টের জন্য একক পিক্সেল সেট করার কোনও একক-আকারের-ফিট নেই - এবং এটি আপনার নিয়ন্ত্রণ / ফর্ম হিসাবে আপনি কী জানেন যে এটি কী ডাবল-বাফার ইত্যাদি হতে পারে)

কেন আপনার একক পিক্সেল সেট করতে হবে?


9

যেখানে আমি প্রচুর একক পিক্সেল অঙ্কন করছি (বিভিন্ন কাস্টমাইজড ডেটা প্রদর্শনের জন্য), আমি সেগুলি বিটম্যাপে আঁকতে চাইছি এবং তারপরে এটি পর্দাতে ঝাপটায়।

বিটম্যাপ গেটপিক্সেল এবং সেটপিক্সেল ক্রিয়াকলাপগুলি বিশেষত দ্রুত নয় কারণ তারা অত্যন্ত বাউন্ডস্কেটিং করে, তবে একটি 'দ্রুত বিটম্যাপ' বর্গ তৈরি করা বেশ সহজ যা একটি বিটম্যাপে দ্রুত প্রবেশ করতে পারে।


2

গেটএইচডিসি তে এমএসডিএন পৃষ্ঠা

আমি মনে করি এটিই আপনি খুঁজছেন। আপনাকে এইচডিসি পেতে হবে এবং তারপরে সেটপিক্সেল ব্যবহারের জন্য জিডিআই কলগুলি ব্যবহার করতে হবে। দ্রষ্টব্য, জিডিআই-এর একটি কালারফ একটি বিজিআর রঙ সংরক্ষণ করে রাখার একটি ডিডাব্লর্ড। কোনও আলফা চ্যানেল নেই, এবং এটি জিডিআই + এর রঙের কাঠামোর মতো আরজিবি নয়।

এটি কোডের একটি ছোট্ট বিভাগ যা আমি একই কাজটি সম্পাদন করতে লিখেছিলাম:

public class GDI
{
    [System.Runtime.InteropServices.DllImport("gdi32.dll")]
    internal static extern bool SetPixel(IntPtr hdc, int X, int Y, uint crColor);
}

{
    ...
    private void OnPanel_Paint(object sender, PaintEventArgs e)
    {
        int renderWidth = GetRenderWidth();
        int renderHeight = GetRenderHeight();
        IntPtr hdc = e.Graphics.GetHdc();

        for (int y = 0; y < renderHeight; y++)
        {
            for (int x = 0; x < renderWidth; x++)
            {
                Color pixelColor = GetPixelColor(x, y);

                // NOTE: GDI colors are BGR, not ARGB.
                uint colorRef = (uint)((pixelColor.B << 16) | (pixelColor.G << 8) | (pixelColor.R));
                GDI.SetPixel(hdc, x, y, colorRef);
            }
        }

        e.Graphics.ReleaseHdc(hdc);
    }
    ...
}

1

স্পষ্টতই ড্রলাইন একটি রেখা আঁকবে যা প্রকৃত নির্দিষ্ট দৈর্ঘ্যের চেয়ে এক পিক্সেল সংক্ষিপ্ত। এখানে কোনও অঙ্কন পয়েন্ট / ড্রপপিক্সেল / হোয়াটনাট বলে মনে হয় না, তবে এর পরিবর্তে আপনি একটি একক পিক্সেল আঁকতে প্রস্থ এবং উচ্চতা সেট করে ড্রআরেক্টাঙ্গেলটি 1 ব্যবহার করতে পারেন।


4
দুর্দান্ত চেষ্টা করুন, তবে আকার 1 এর সাথে এটি 2x2 পিক্সেল আঁকবে। (এটিকে একটি লাইনের পাশে আঁকুন এবং আপনি এটি দ্বিগুণ প্রস্থের দেখতে পাবেন)) এবং আকার শূন্যের সাথে অবশ্যই এটি কিছুই আঁকেনি।
টি চিহ্নিত করুন

ঠিক আছে, আমার ভুল। :) ভাল জিনিস ফিল রেক্টাঙ্গেলটি কৌশলটি করে।
রাইটমিস

1

ড্যাশস্টাইল.ড্যাশস্টাইল.ডট দিয়ে একটি পেন ব্যবহার করে একটি লাইন 2px অঙ্কন করা হচ্ছে একটি একক পিক্সেল আঁকুন।

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        using (Pen p = new Pen(Brushes.Black))
        {
            p.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            e.Graphics.DrawLine(p, 10, 10, 11, 10);
        }
    }

0

আপনি যদি স্মোথিংমড = অ্যান্টিএলিয়াস সহ কোনও গ্রাফিক আঁকেন তবে বেশিরভাগ অঙ্কন পদ্ধতি এক পিক্সেলের বেশি আঁকবে। আপনি যদি কেবল একটি পিক্সেল আঁকতে চান তবে একটি 1x1 বিটম্যাপ তৈরি করুন, বিটম্যাপের পিক্সেলটিকে পছন্দসই রঙে সেট করুন, তারপরে গ্রাফিকটিতে বিটম্যাপ আঁকুন।

using (var pixel = new Bitmap(1, 1, e.Graphics))
{
    pixel.SetPixel(0, 0, color);
    e.Graphics.DrawImage(pixel, x, y);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.