Фильтры свертки - EdgeEnhance - PullRequest
       39

Фильтры свертки - EdgeEnhance

0 голосов
/ 08 апреля 2020

У меня есть задача , чтобы сделать функцию, используя язык C#. Функция Edge-Enhance для Bitmap.

Код:

public static bool EdgeEnhance(Bitmap b, byte nThreshold)
    {
        // This one works by working out the greatest difference between a nPixel and it's eight neighbours.
        // The threshold allows softer edges to be forced down to black, use 0 to negate it's effect.
        Bitmap b2 = (Bitmap) b.Clone();

        // GDI+ still lies to us - the return format is BGR, NOT RGB.
        BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
        BitmapData bmData2 = b2.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        int stride = bmData.Stride;
        System.IntPtr Scan0 = bmData.Scan0;
        System.IntPtr Scan02 = bmData2.Scan0;

        unsafe
        {
            byte * p = (byte *)(void *)Scan0;
            byte * p2 = (byte *)(void *)Scan02;

            int nOffset = stride - b.Width*3;
            int nWidth = b.Width * 3;

            int nPixel = 0, nPixelMax = 0;

            p += stride;
            p2 += stride;

            for (int y = 1; y < b.Height-1; ++y)
            {
                p += 3;
                p2 += 3;
                for (int x = 3; x < nWidth-3; ++x)
                {
                    nPixelMax = Math.Abs((p2 - stride + 3)[0] - (p2 + stride - 3)[0]);
                    nPixel = Math.Abs((p2 + stride + 3)[0] - (p2 - stride - 3)[0]);
                    if (nPixel > nPixelMax) nPixelMax = nPixel;
                    nPixel = Math.Abs((p2 - stride)[0] - (p2 + stride)[0]);
                    if (nPixel > nPixelMax) nPixelMax = nPixel;
                    nPixel = Math.Abs((p2 + 3)[0] - (p2 - 3)[0]);
                    if (nPixel > nPixelMax) nPixelMax = nPixel;
                    if (nPixelMax > nThreshold && nPixelMax > p[0])
                        p[0] = (byte) Math.Max(p[0], nPixelMax);

                    ++ p;
                    ++ p2;          
                }

                p += nOffset + 3;
                p2 += nOffset + 3;
            }
        }   

        b.UnlockBits(bmData);
        b2.UnlockBits(bmData2);
        return true;
    }

Мне удалось заставить его работать с помощью BitmapData. Но мне нужно сделать это, используя только класс Bitmap с такими функциями, как setPixel и getPixel . Может ли кто-нибудь помочь мне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...