Очень медленно работает код!

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Dimon16
Новичок
Новичок
 
Сообщения: 27
Зарегистрирован: 30.12.2009 (Ср) 20:37

Очень медленно работает код!

Сообщение Dimon16 » 03.09.2010 (Пт) 21:05

В этом коде производится приращение значений r,g,b - по выбору(из ComboBox)
Код: Выделить всё
public partial class LavelsRGB : Form
    {
        Bitmap IMG = null;
        BitmapData BmpData = null;
        IntPtr PixPointer = IntPtr.Zero;
        byte[] MSV = null;

        const int Level_R = 0;
        const int Level_G = 1;
        const int Level_B = 2;

        int Step = 0;
        int _Width = 0;
        int _Height = 0;

        public LavelsRGB(Bitmap MainBitmap)
        {
            InitializeComponent();
            if (MainBitmap == null)
                throw new ArgumentException();
            else
            {
                IMG = MainBitmap;
                PreviewBox.Image = (Image)IMG;
            }
            switch (IMG.PixelFormat)
            {
                case PixelFormat.Alpha | PixelFormat.Format32bppArgb | PixelFormat.Format32bppPArgb:
                    {
                        Step = 4;
                        break;
                    }
                case PixelFormat.Format24bppRgb:
                    {
                        Step = 3;
                        break;
                    }
                default:
                    {
                        throw new ArgumentException("Неподходящий формат пикселей!");
                        break;
                    }
            }
            _Width = IMG.Width;
            _Height = IMG.Height;
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            textBox1.Text = trackBar1.Value.ToString();
            int Color_Buffer = 0;
            if (IMG != null)
            {
                BmpData = IMG.LockBits(new Rectangle(0, 0, IMG.Width, IMG.Height),
                    ImageLockMode.ReadWrite, IMG.PixelFormat);
                PixPointer = BmpData.Scan0;
                MSV = new byte[_Height * _Width * Step];
                Marshal.Copy(PixPointer, MSV, 0, MSV.Length);
                switch (comboBox1.SelectedIndex)
                {
                    case Level_R:
                        {
                            for (int AX = 0; AX < BmpData.Width; AX++)
                            {
                                for (int AY = 0; AY < BmpData.Height; AY++)
                                {
                                    Color_Buffer = MSV[((AY * _Width + AX) * Step) + 2];
                                    if ((Color_Buffer != 255) && (Color_Buffer > 0))
                                    {
                                        if (Color_Buffer + trackBar1.Value > 255)
                                            MSV[((AY * _Width + AX) * Step) + 2] = 255;
                                        else if (Color_Buffer + trackBar1.Value < 0)
                                            MSV[((AY * _Width + AX) * Step) + 2] = 1;
                                        else
                                            MSV[((AY * _Width + AX) * Step) + 2] += Convert.ToByte(trackBar1.Value);
                                    }
                                }
                            }
                            break;
                        }
                    case Level_G:
                        {
                            for (int AX = 0; AX < BmpData.Width; AX++)
                            {
                                for (int AY = 0; AY < BmpData.Height; AY++)
                                {
                                    Color_Buffer = MSV[((AY * _Width + AX) * Step) + 1];
                                    if ((Color_Buffer != 255) && (Color_Buffer > 0))
                                    {
                                        if (Color_Buffer + trackBar1.Value > 255)
                                            MSV[((AY * _Width + AX) * Step) + 1] = 255;
                                        else if (Color_Buffer + trackBar1.Value < 0)
                                            MSV[((AY * _Width + AX) * Step) + 1] = 1;
                                        else
                                            MSV[((AY * _Width + AX) * Step) + 1] += Convert.ToByte(trackBar1.Value);
                                    }
                                }
                            }
                            break;
                        }
                    case Level_B:
                        {
                            for (int AX = 0; AX < BmpData.Width; AX++)
                            {
                                for (int AY = 0; AY < BmpData.Height; AY++)
                                {
                                    Color_Buffer = MSV[((AY * _Width + AX) * Step) + 0];
                                    if ((Color_Buffer != 255) && (Color_Buffer > 0))
                                    {
                                        if (Color_Buffer + trackBar1.Value > 255)
                                            MSV[((AY * _Width + AX) * Step) + 0] = 255;
                                        else if (Color_Buffer + trackBar1.Value < 0)
                                            MSV[((AY * _Width + AX) * Step) + 0] = 1;
                                        else
                                            MSV[((AY * _Width + AX) * Step) + 0] += Convert.ToByte(trackBar1.Value);
                                    }
                                }
                            }
                            break;
                        }
                }
                Marshal.Copy(MSV, 0, PixPointer, MSV.Length);
                IMG.UnlockBits(BmpData);
                PreviewBox.Image = (Image)IMG;
            }
        }

    }

Он обробатывает изображение 1024x768 24bpp за 20сек(наверно даже медленнее чем Get/Set Pixel).
В статьях написано что через Lock/Unlock Bits работает быстро, а на деле - 20сек.Это так и должно быть или я коряво написал?

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: Очень медленно работает код!

Сообщение FaKk2 » 05.10.2010 (Вт) 20:56

Прогони под dotTrace (например) и посмотри в каком участке больше всего тратится времени.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList