.net图像处理

以下为引用:

反相
public static bool Invert(Bitmap b)
{
         BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
         ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 
unsafe 

byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3; 
int nWidth = b.Width * 3;
for(int y=0;y < b.Height;++y)
         {
         for(int x=0; x < nWidth; ++x screen.width/2)this.width=screen.width/2" vspace=2 border=0>
         {
p[0] = (byte)(255-p[0]);
++p;
}
p += nOffset;
}
}

b.UnlockBits(bmData);
return true;
}


public static bool Grayscale(Bitmap b)
{
//变成黑白
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
byte red, green, blue;
for(int y=0;y < b.Height;++y)
{
for(int x=0; x < b.Width; ++x screen.width/2)this.width=screen.width/2" vspace=2 border=0>
{
blue = p[0];
green = p[1];
red = p[2];
p[0] = p[1] = p[2] = (byte)(.299 * red 
+ .587 * green 
+ .114 * blue);
p += 3;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}

亮度
public static bool Brightness(Bitmap b,int nBrightness)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 
unsafe 

byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3; 
int nWidth = b.Width * 3;
for(int y=0;y<b.Height;++y)
{
for (int x = 0;  x < nWidth; ++x)
{
int nVal = (int) (p[0] + nBrightness);
if (nVal < 0) nVal = 0;
if (nVal > 255) nVal = 255;
p[0] = (byte)nVal;
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}

对比度
public static bool Contrast(Bitmap b,int nContrast)
{
if (nContrast < -100) return false;
if (nContrast >  100) return false;
double pixel = 0, contrast = (100.0+nContrast)/100.0;
contrast *= contrast;
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 
unsafe 

byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3; 
int nWidth = b.Width * 3;
for(int y=0;y<b.Height;++y)
{
for (int x = 0;  x < nWidth;++x)
{
         byte color = p[0];    
pixel = color/255.0;
pixel -= 0.5;
pixel *= contrast;
pixel += 0.5;
pixel *= 255;
if (pixel < 0) pixel = 0;
if (pixel > 255) pixel = 255;
p[0] = (byte) pixel;
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}


public static bool Gamma(Bitmap b)
{
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 

byte [] redGamma = new byte [256];
byte [] greenGamma = new byte [256];
byte [] blueGamma = new byte [256];

for (int i = 0; i < 256; ++i)
{
redGamma[i] = (byte)Math.Min(255, (int)(( 255.0 
      * Math.Pow(i/255.0, 1.0/5)) + 0.5));//其中1.0/5里的5是红色Gamma值。
greenGamma[i] = (byte)Math.Min(255, (int)(( 255.0 
      * Math.Pow(i/255.0, 1.0/5)) + 0.5));
blueGamma[i] = (byte)Math.Min(255, (int)(( 255.0 
* Math.Pow(i/255.0, 1.0/5)) + 0.5));
}

unsafe 

byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3; 
int nWidth = b.Width * 3;

byte red, green, blue;
for(int y=0;y<b.Height;++y)
{
for (int x = 0;  x < b.Width;++x)
{
blue = p[0];
green = p[1];
red = p[2];

p[0]=(byte)blueGamma[(int)blue];
p[1]=(byte)greenGamma[(int)green];
p[2]=(byte)redGamma[(int)red];
p+=3;
}
p += nOffset;
}
}

b.UnlockBits(bmData);
return true;
}

通道
public static bool Channel(Bitmap b,char rgb)

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), 
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
int stride = bmData.Stride; 
System.IntPtr Scan0 = bmData.Scan0; 

unsafe 

byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3; 
int nWidth = b.Width * 3;

byte red, green, blue;
for(int y=0;y<b.Height;++y)
{
for (int x = 0;  x < b.Width;++x)
{
switch(rgb)
{
case 'r':
           p[0]=(byte)0;
p[1]=(byte)0;
break;
case 'g':
p[0]=(byte)0;
p[2]=(byte)0;
break;
case 'b':
p[2]=(byte)0;
p[1]=(byte)0;
break;
}
p+=3;
}
p += nOffset;
}
     }

b.UnlockBits(bmData);

return true;
}
原文地址:https://www.cnblogs.com/gergro/p/462838.html