Re[5]: Обработка изображений
От: Powerz Россия https://zagosk.in
Дата: 19.03.06 17:13
Оценка:
Здравствуйте, GePo, Вы писали:


C>>Сори, не внимательно прочитал вопрос. Посмотри как сделано здесь http://www.bobpowell.net/grayscale.htm


GP>Да, вроде у проблема в цветах, т.к. используя GetPixel/SetPixel все фильтры работают правильно — но медленно. Хотелось бы быстро, как я делал, только вот как правильно работать с цветами — непонятно.



public static Bitmap RGBToGrey(Bitmap picture, ProcessingType type)
        {
            Bitmap pic = (Bitmap)picture.Clone();
            int pictureWidth = pic.Width;
            switch (type)
            {
                case ProcessingType.Matrix:
                    Graphics g = Graphics.FromImage(pic);
                    float[][] greyArray = 
                    { 
                        new float[] {0.299f, 0.299f, 0.299f, 0, 0},
                        new float[] {0.587f, 0.587f, 0.587f, 0, 0},
                        new float[] {0.114f, 0.114f, 0.114f, 0, 0},
                        new float[] {0,      0,      0,      1, 0},
                        new float[] {0,      0,      0,      1, 1}
                    };
                    ColorMatrix greyMatrix = new ColorMatrix(greyArray);
                    ImageAttributes greyAttributes = new ImageAttributes(); 
            
                    greyAttributes.SetColorMatrix(greyMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
                    Rectangle picRectangle = new Rectangle(0, 0, pic.Width, pic.Height);
                    g.DrawImage(pic, picRectangle, 0, 0, pic.Width, pic.Height, GraphicsUnit.Pixel, greyAttributes);
                    break;

                case ProcessingType.PerPixel:
                    Color pixelColor;
                    byte byteGrey = 0;
                    int intGrey = 0;
                    
                    for (int y = 0; y < pic.Height; y++)
                    {
                        for (int x = 0; x < pictureWidth; x++)
                        {
                            pixelColor = pic.GetPixel(x, y);
                            intGrey = (int)(0.299 * pixelColor.R + 0.587 * pixelColor.G + 0.144 * pixelColor.B);
                            if (intGrey > 255)
                                byteGrey = 255;
                            else
                                byteGrey = (byte)intGrey;
                            pic.SetPixel(x, y, Color.FromArgb(byteGrey, byteGrey, byteGrey));
                        }
                    }
                    break;

                case ProcessingType.PerPixelUnsafe:
                    BitmapData bmData = pic.LockBits(new Rectangle(0, 0, pic.Width, pic.Height), 
                        ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
                    IntPtr scan = bmData.Scan0; 
                    
                    unsafe 
                    { 
                        byte* p = (byte*)scan;
                        byte red;
                        byte green;
                        byte blue;

                        for (int y = 0; y < pic.Height; y++)
                        {
                            for (int x = 0; x < pictureWidth; x++)
                            {
                                blue  = p[0];
                                green = p[1];
                                red   = p[2];
                                p[0]  = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
                                p += 3;
                            }
                        }
                    }
                    pic.UnlockBits(bmData);
                    break;
            }
            return pic;
        }
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
https://zagosk.in
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.