سؤال

أنا عالق في محاولة لتشغيل بكسل واحد على شكل ويندوز.

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

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

يجب أن يكون لدى API حقا طريقة لتعيين لون بكسل واحد، لكنني لا أرى واحدة.

أنا أستخدم C #.

هل كانت مفيدة؟

المحلول

هذا سوف يحدد بكسل واحد:

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

نصائح أخرى

ال Graphics الكائن ليس لديه هذا، لأنه تجريد ويمكن استخدامه لتغطية تنسيق رسومات ناقلات. في هذا السياق، فإن وضع بكسل واحد لن يكون منطقيا. ال Bitmap تنسيق الصورة لديه GetPixel() و SetPixel(), ، ولكن ليس كائن رسومات بنيت على واحد. بالنسبة إلى السيناريو الخاص بك، يبدو خيارك حقا وكأنه الوحيد لأنه لا يوجد مقاس واحد - كل طريقة لتعيين بكسل واحد لكائن الرسومات العامة (ولا تعرف بالضبط ما هو عليه، كما تحكم / نموذجك يمكن أن تكون مزدوجة مخزنة، وما إلى ذلك)

لماذا تحتاج إلى تعيين بكسل واحد؟

فقط لإظهار الكود الكامل ل Henk Holterman الإجابة:

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

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

حيث أرسم الكثير من البكسلات الفردية (لمختلف عرض البيانات المخصصة)، أميل إلى رسمها إلى صورة نقطية ثم يتم تشغيلها على الشاشة.

تعتبر عمليات GetPixel Bitmap و SetPixel سريعة بشكل خاص لأنها تقومون بالكثير من الأراضي المنهوبة، ولكن من السهل جدا جعل فئة "نقطية سريعة" والتي تتمتع بالوصول السريع إلى صورة نقطية.

على ما يبدو Drawline يسحب خطا واحدا بكسل واحد من الطول المحدد الفعلي. لا يبدو أن هناك نقطة مشحونة / براشيد / ما

صفحة MSDN على GethDC

وأعتقد أن هذا هو ما كنت أبحث عنه. ستحتاج إلى الحصول على HDC ثم استخدم مكالمات GDI لاستخدام SetPixel. ملاحظة، أن ColorRef في GDI هو تخزين DWORD لون BGR. لا توجد قناة Alpha، وهي ليست RGB مثل هيكل لون GDI +.

هذا قسم صغير من التعليمات البرمجية التي كتبتها لإنجاز نفس المهمة:

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

رسم خط 2px باستخدام قلم مع dashstyle.dashstyle.dot يرسم بكسل واحد.

    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);
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top