Страница: 1 |
Вопрос: Скорость выполнения кода | Добавлено: 15.12.10 14:18 |
Автор вопроса: ![]() |
Почему этот код
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 Автор ответа: ![]() ![]() ICQ: 345685652 Вопросов: 96 Ответов: 1212 |
Web-сайт: Профиль | Цитата | #1 | Добавлено: 15.12.10 14:54 |
ну фиг знает... и что это в начале означает?
|
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #2 | Добавлено: 15.12.10 15:52 |
вероятно, из-за небезопасного одноименного unsafe ? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 20 Ответов: 79 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 15.12.10 17:10 |
Main.AllPixelsBytes - это Image.Width*Image.Height*(3 или 4,взависимости от формата пикселей) |
Страница: 1 |
|