Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Скорость выполнения кода Добавлено: 15.12.10 14:18  

Автор вопроса:  Лёха | Web-сайт: supersait16.ucoz.ru
Почему этот код
if (Value < -100) return null;
            if (Value > 100) return null;

            double Pixel = 0, Contrast = (100.0 + Value) / 100.0;

            Contrast *= Contrast;

            int Value_Red, Value_Green, Value_Blue;

            BitmapData MainIMGData = Main.LockBits(new Rectangle(0, 0, Main.Width, Main.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            int Stride = MainIMGData.Stride;
            IntPtr MainIMGPtr = MainIMGData.Scan0;

            unsafe
            {
                byte* Ptr = (byte*)(void*)MainIMGPtr;

                int N_Offset = Stride - Main.Width * 3;

                for (int Y = 0; Y < Main.Height; ++Y)
                {
                    for (int X = 0; X < Main.Width; ++X)
                    {
                        Value_Blue = Ptr[0];
                        Value_Green = Ptr[1];
                        Value_Red = Ptr[2];

                        Pixel = Value_Red / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[2] = (byte)Pixel;

                        Pixel = Value_Green / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[1] = (byte)Pixel;

                        Pixel = Value_Blue / 255.0;
                        Pixel -= 0.5;
                        Pixel *= Contrast;
                        Pixel += 0.5;
                        Pixel *= 255;
                        if (Pixel < 0) Pixel = 0;
                        if (Pixel > 255) Pixel = 255;
                        Ptr[0] = (byte)Pixel;

                        Ptr += 3;
                    }
                    Ptr += N_Offset;
                }
            }
            Main.UnlockBits(MainIMGData);
            return Main;

работает быстрее этого
int RedVal, GreenVal, BlueVal;

            double Pixel;
            double Contrast = (100.0 + Value) / 100.0;

            Contrast = Contrast * Contrast;

            for (int I = 0; I < Main.AllPixelsBytes; I += Main.BytesPerPixel)
            {
                BlueVal = *(Main.Unsafe_IMG_Scan0 + (I + 0));
                GreenVal = *(Main.Unsafe_IMG_Scan0 + (I + 1));
                RedVal = *(Main.Unsafe_IMG_Scan0 + (I + 2));

                Pixel = RedVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 2)) = Convert.ToByte(Pixel);

                Pixel = GreenVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 1)) = Convert.ToByte(Pixel);

                Pixel = BlueVal / 255.0;
                Pixel = Pixel - 0.5;
                Pixel = Pixel * Contrast;
                Pixel = Pixel + 0.5;
                Pixel = Pixel * 255;
                if (Pixel < 0) Pixel = 0;
                if (Pixel > 255) Pixel = 255;
                *(Main.Unsafe_IMG_Scan0 + (I + 0)) = Convert.ToByte(Pixel);
            }
            Main.UnLock();
            return Main.Picture;

Вроде всё одинаково,только я сделал так,чтобы всё это выполнялось в одном цикле!

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #1
Добавлено: 15.12.10 14:54
  1.                         Value_Blue = Ptr[0];
  2.                         Value_Green = Ptr[1];
  3.                         Value_Red = Ptr[2];
  1.                 BlueVal = *(Main.Unsafe_IMG_Scan0 + (I + 0));
  2.                 GreenVal = *(Main.Unsafe_IMG_Scan0 + (I + 1));
  3.                 RedVal = *(Main.Unsafe_IMG_Scan0 + (I + 2));


  1. Ptr[2] = (byte)Pixel;
  1. *(Main.Unsafe_IMG_Scan0 + (I + 2)) = Convert.ToByte(Pixel);


ну фиг знает...

и что это в начале означает?
  1. I < Main.AllPixelsBytes

Ответить

Номер ответа: 2
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #2 Добавлено: 15.12.10 15:52
вероятно, из-за небезопасного одноименного unsafe ?

Ответить

Номер ответа: 3
Автор ответа:
 Лёха



Вопросов: 20
Ответов: 79
 Web-сайт: supersait16.ucoz.ru
 Профиль | | #3
Добавлено: 15.12.10 17:10
Main.AllPixelsBytes - это Image.Width*Image.Height*(3 или 4,взависимости от формата пикселей)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам