Страница: 1 |
Страница: 1 |
Вопрос: Скорость выполнения кода
Добавлено: 15.12.10 14:18
Автор вопроса: Лёха | Web-сайт:
Почему этот код
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;
работает быстрее этого
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-сайт:
Профиль | | #1
Добавлено: 15.12.10 14:54
ну фиг знает...
и что это в начале означает?
Номер ответа: 2
Автор ответа:
AgentFire
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,взависимости от формата пикселей)