- Код: Выделить всё
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сек.Это так и должно быть или я коряво написал?