亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? filters.cs

?? 使用C#程式語言撰寫的固定為3x3的Convolution濾波器
?? CS
字號:
using System;
using System.Drawing;
using System.Drawing.Imaging;

namespace CSharpFilters
{
	public class ConvMatrix
	{
		public int TopLeft = 0, TopMid = 0, TopRight = 0;
		public int MidLeft = 0, Pixel = 1, MidRight = 0;
		public int BottomLeft = 0, BottomMid = 0, BottomRight = 0;
		public int Factor = 1;
		public int Offset = 0;
		public void SetAll(int nVal)
		{
			TopLeft = TopMid = TopRight = MidLeft = Pixel = MidRight = BottomLeft = BottomMid = BottomRight = nVal;
		}
	}


	public class BitmapFilter
	{
		public static bool Invert(Bitmap b)
		{
			// GDI+ still lies to us - the return format is BGR, NOT 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;
	
				for(int y=0;y<b.Height;++y)
				{
					for(int x=0; x < nWidth; ++x )
					{
						p[0] = (byte)(255-p[0]);
						++p;
					}
					p += nOffset;
				}
			}

			b.UnlockBits(bmData);

			return true;
		}

		public static bool GrayScale(Bitmap b)
		{
			// GDI+ still lies to us - the return format is BGR, NOT 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;

				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] = 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)
		{
			if (nBrightness < -255 || nBrightness > 255)
				return false;

			// GDI+ still lies to us - the return format is BGR, NOT 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;

			int nVal = 0;

			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 )
					{
						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, sbyte nContrast)
		{
			if (nContrast < -100) return false;
			if (nContrast >  100) return false;

			double pixel = 0, contrast = (100.0+nContrast)/100.0;

			contrast *= contrast;

			int red, green, blue;
			
			// GDI+ still lies to us - the return format is BGR, NOT 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;

				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];
				
						pixel = red/255.0;
						pixel -= 0.5;
						pixel *= contrast;
						pixel += 0.5;
						pixel *= 255;
						if (pixel < 0) pixel = 0;
						if (pixel > 255) pixel = 255;
						p[2] = (byte) pixel;

						pixel = green/255.0;
						pixel -= 0.5;
						pixel *= contrast;
						pixel += 0.5;
						pixel *= 255;
						if (pixel < 0) pixel = 0;
						if (pixel > 255) pixel = 255;
						p[1] = (byte) pixel;

						pixel = blue/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 += 3;
					}
					p += nOffset;
				}
			}

			b.UnlockBits(bmData);

			return true;
		}
	
		public static bool Gamma(Bitmap b, double red, double green, double blue)
		{
			if (red < .2 || red > 5) return false;
			if (green < .2 || green > 5) return false;
			if (blue < .2 || blue > 5) return false;

			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/red)) + 0.5));
				greenGamma[i] = (byte)Math.Min(255, (int)(( 255.0 * Math.Pow(i/255.0, 1.0/green)) + 0.5));
				blueGamma[i] = (byte)Math.Min(255, (int)(( 255.0 * Math.Pow(i/255.0, 1.0/blue)) + 0.5));
			}

			// GDI+ still lies to us - the return format is BGR, NOT 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;

				for(int y=0;y<b.Height;++y)
				{
					for(int x=0; x < b.Width; ++x )
					{
						p[2] = redGamma[ p[2] ];
						p[1] = greenGamma[ p[1] ];
						p[0] = blueGamma[ p[0] ];

						p += 3;
					}
					p += nOffset;
				}
			}

			b.UnlockBits(bmData);

			return true;
		}

		public static bool Color(Bitmap b, int red, int green, int blue)
		{
			if (red < -255 || red > 255) return false;
			if (green < -255 || green > 255) return false;
			if (blue < -255 || blue > 255) return false;

			// GDI+ still lies to us - the return format is BGR, NOT 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 nPixel;

				for(int y=0;y<b.Height;++y)
				{
					for(int x=0; x < b.Width; ++x )
					{
						nPixel = p[2] + red;
						nPixel = Math.Max(nPixel, 0);
						p[2] = (byte)Math.Min(255, nPixel);

						nPixel = p[1] + green;
						nPixel = Math.Max(nPixel, 0);
						p[1] = (byte)Math.Min(255, nPixel);

						nPixel = p[0] + blue;
						nPixel = Math.Max(nPixel, 0);
						p[0] = (byte)Math.Min(255, nPixel);

						p += 3;
					}
					p += nOffset;
				}
			}

			b.UnlockBits(bmData);

			return true;
		}

		public static bool Conv3x3(Bitmap b, ConvMatrix m)
		{
			// Avoid divide by zero errors
			if (0 == m.Factor) return false;

			Bitmap bSrc = (Bitmap)b.Clone(); 

			// GDI+ still lies to us - the return format is BGR, NOT RGB.
			BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
			BitmapData bmSrc = bSrc.LockBits(new Rectangle(0, 0, bSrc.Width, bSrc.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

			int stride = bmData.Stride;
			int stride2 = stride * 2;
			System.IntPtr Scan0 = bmData.Scan0;
			System.IntPtr SrcScan0 = bmSrc.Scan0;

			unsafe
			{
				byte * p = (byte *)(void *)Scan0;
				byte * pSrc = (byte *)(void *)SrcScan0;

				int nOffset = stride - b.Width*3;
				int nWidth = b.Width - 2;
				int nHeight = b.Height - 2;

				int nPixel;

				for(int y=0;y < nHeight;++y)
				{
					for(int x=0; x < nWidth; ++x )
					{
						nPixel = ( ( ( (pSrc[2] * m.TopLeft) + (pSrc[5] * m.TopMid) + (pSrc[8] * m.TopRight) +
							(pSrc[2 + stride] * m.MidLeft) + (pSrc[5 + stride] * m.Pixel) + (pSrc[8 + stride] * m.MidRight) +
							(pSrc[2 + stride2] * m.BottomLeft) + (pSrc[5 + stride2] * m.BottomMid) + (pSrc[8 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

						if (nPixel < 0) nPixel = 0;
						if (nPixel > 255) nPixel = 255;

						p[5 + stride]= (byte)nPixel;

						nPixel = ( ( ( (pSrc[1] * m.TopLeft) + (pSrc[4] * m.TopMid) + (pSrc[7] * m.TopRight) +
							(pSrc[1 + stride] * m.MidLeft) + (pSrc[4 + stride] * m.Pixel) + (pSrc[7 + stride] * m.MidRight) +
							(pSrc[1 + stride2] * m.BottomLeft) + (pSrc[4 + stride2] * m.BottomMid) + (pSrc[7 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

						if (nPixel < 0) nPixel = 0;
						if (nPixel > 255) nPixel = 255;
							
						p[4 + stride] = (byte)nPixel;

						nPixel = ( ( ( (pSrc[0] * m.TopLeft) + (pSrc[3] * m.TopMid) + (pSrc[6] * m.TopRight) +
							(pSrc[0 + stride] * m.MidLeft) + (pSrc[3 + stride] * m.Pixel) + (pSrc[6 + stride] * m.MidRight) +
							(pSrc[0 + stride2] * m.BottomLeft) + (pSrc[3 + stride2] * m.BottomMid) + (pSrc[6 + stride2] * m.BottomRight)) / m.Factor) + m.Offset); 

						if (nPixel < 0) nPixel = 0;
						if (nPixel > 255) nPixel = 255;

						p[3 + stride] = (byte)nPixel;

						p += 3;
						pSrc += 3;
					}
					p += nOffset;
					pSrc += nOffset;
				}
			}

			b.UnlockBits(bmData);
			bSrc.UnlockBits(bmSrc);

			return true;
		}
		public static bool Smooth(Bitmap b, int nWeight /* default to 1 */)
		{
			ConvMatrix m = new ConvMatrix();
			m.SetAll(1);
			m.Pixel = nWeight;
			m.Factor = nWeight + 8;

			return  BitmapFilter.Conv3x3(b, m);
		}

		public static bool GaussianBlur(Bitmap b, int nWeight /* default to 4*/)
		{
			ConvMatrix m = new ConvMatrix();
			m.SetAll(1);
			m.Pixel = nWeight;
			m.TopMid = m.MidLeft = m.MidRight = m.BottomMid = 2;
			m.Factor = nWeight + 12;

			return  BitmapFilter.Conv3x3(b, m);
		}
		public static bool MeanRemoval(Bitmap b, int nWeight /* default to 9*/ )
		{
			ConvMatrix m = new ConvMatrix();
			m.SetAll(-1);
			m.Pixel = nWeight;
			m.Factor = nWeight - 8;

			return BitmapFilter.Conv3x3(b, m);
		}
		public static bool Sharpen(Bitmap b, int nWeight /* default to 11*/ )
		{
			ConvMatrix m = new ConvMatrix();
			m.SetAll(0);
			m.Pixel = nWeight;
			m.TopMid = m.MidLeft = m.MidRight = m.BottomMid = -2;
			m.Factor = nWeight - 8;

			return  BitmapFilter.Conv3x3(b, m);
		}
		public static bool EmbossLaplacian(Bitmap b)
		{
			ConvMatrix m = new ConvMatrix();
			m.SetAll(-1);
			m.TopMid = m.MidLeft = m.MidRight = m.BottomMid = 0;
			m.Pixel = 4;
			m.Offset = 127;

			return  BitmapFilter.Conv3x3(b, m);
		}	
		public static bool EdgeDetectQuick(Bitmap b)
		{
			ConvMatrix m = new ConvMatrix();
			m.TopLeft = m.TopMid = m.TopRight = -1;
			m.MidLeft = m.Pixel = m.MidRight = 0;
			m.BottomLeft = m.BottomMid = m.BottomRight = 1;
		
			m.Offset = 127;

			return  BitmapFilter.Conv3x3(b, m);
		}
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线不卡一区| 亚洲国产精品久久人人爱| 91精品国产综合久久香蕉麻豆 | 日韩一级二级三级| 欧美日韩另类国产亚洲欧美一级| 91一区二区在线观看| 成人av动漫在线| 一本一道综合狠狠老| 色综合久久66| 欧美日本一区二区| 欧美一区永久视频免费观看| 欧美一区二区成人6969| 欧美成va人片在线观看| 久久久久国产精品麻豆ai换脸| 国产亚洲美州欧州综合国| 国产情人综合久久777777| 最新高清无码专区| 亚洲高清不卡在线观看| 日产精品久久久久久久性色| 韩国理伦片一区二区三区在线播放| 国产精品99久| 色八戒一区二区三区| 欧美tk丨vk视频| 国产精品久久久久毛片软件| 亚洲一区免费观看| 精品一二线国产| 色噜噜久久综合| 日韩欧美色综合网站| 国产欧美一区二区精品忘忧草| 亚洲欧美日韩一区二区 | 色女孩综合影院| 91麻豆精品国产91久久久| 精品国产凹凸成av人导航| 亚洲欧美一区二区三区极速播放| 午夜国产不卡在线观看视频| 国产伦精一区二区三区| 欧美伊人久久久久久午夜久久久久| 日韩欧美激情四射| 亚洲欧洲av一区二区三区久久| 日韩国产欧美三级| 成人app网站| 欧美α欧美αv大片| 亚洲欧美日韩国产综合在线| 精品一区在线看| 在线一区二区视频| 欧美极品少妇xxxxⅹ高跟鞋 | 国产成人亚洲综合a∨婷婷| 欧美丝袜丝交足nylons图片| 国产日韩欧美一区二区三区乱码| 午夜影院在线观看欧美| 大桥未久av一区二区三区中文| 欧美一区二区三区四区五区| 中文字幕在线观看一区| 国产一区二区伦理片| 欧美日韩电影在线| 亚洲黄色录像片| 国产91丝袜在线18| 久久一夜天堂av一区二区三区 | 欧美成人女星排行榜| 性感美女极品91精品| 91亚洲国产成人精品一区二区三 | 最新高清无码专区| 丰满亚洲少妇av| 久久久久久**毛片大全| 免费久久精品视频| 9191国产精品| 日韩精品一区第一页| 欧美日韩国产高清一区二区| 亚洲男人的天堂一区二区| 成人黄色网址在线观看| 久久蜜桃一区二区| 国产精品538一区二区在线| 精品三级av在线| 精品中文av资源站在线观看| 26uuu色噜噜精品一区二区| 日韩影院在线观看| 日韩亚洲欧美高清| 麻豆成人在线观看| 精品国产在天天线2019| 激情综合色综合久久综合| 精品国产乱码久久久久久夜甘婷婷 | 中文乱码免费一区二区| 国产成人精品亚洲777人妖 | 一区二区三区欧美亚洲| 色香蕉久久蜜桃| 亚洲国产视频一区| 69p69国产精品| 九色综合国产一区二区三区| 欧美精品一区二区三| 国产不卡视频在线观看| 国产精品视频线看| 91麻豆视频网站| 午夜精品久久久久久久久久 | 国产老妇另类xxxxx| 日本一区二区三级电影在线观看| 成人午夜免费电影| 亚洲主播在线播放| 日韩欧美不卡一区| 成人免费视频网站在线观看| 亚洲欧美偷拍卡通变态| 制服丝袜亚洲网站| 国产乱码精品一区二区三区五月婷| 欧美国产日韩在线观看| 欧洲视频一区二区| 捆绑变态av一区二区三区| 国产视频不卡一区| 欧美日韩视频第一区| 国产一区在线不卡| 亚洲色图另类专区| 欧美一级日韩一级| 成a人片亚洲日本久久| 亚洲成人自拍偷拍| 久久久电影一区二区三区| 色婷婷综合激情| 国产一区欧美一区| 亚洲已满18点击进入久久| 日韩精品中文字幕在线不卡尤物 | 国产欧美日韩久久| 欧美日本在线一区| 成人18视频日本| 天堂午夜影视日韩欧美一区二区| 国产欧美综合在线| 欧美一区二区精品在线| 97se亚洲国产综合自在线观| 六月婷婷色综合| 亚洲最大成人网4388xx| 久久精品一区二区| 日韩一级免费观看| 亚洲成人中文在线| 国产精品―色哟哟| 欧美mv日韩mv| 欧美日韩1234| 欧美专区亚洲专区| 成人久久久精品乱码一区二区三区| 日韩av中文字幕一区二区| 亚洲男人的天堂av| 国产精品素人一区二区| 欧美成人精品1314www| 欧美色图在线观看| 色综合久久66| 波多野结衣在线aⅴ中文字幕不卡 波多野结衣在线一区 | 三级精品在线观看| 亚洲一区二区三区美女| 综合激情网...| 国产精品国产成人国产三级 | 99精品国产视频| 成人黄色一级视频| 国产高清久久久久| 国产激情视频一区二区在线观看 | 欧美这里有精品| 91麻豆福利精品推荐| 成人影视亚洲图片在线| 高清日韩电视剧大全免费| 国产精品亚洲专一区二区三区| 精久久久久久久久久久| 久久精品国产第一区二区三区| 秋霞电影一区二区| 精品一区二区三区免费观看| 国模无码大尺度一区二区三区| 麻豆专区一区二区三区四区五区| 青青国产91久久久久久| 日本免费新一区视频| 麻豆精品一区二区综合av| 蜜桃视频一区二区| 国产一区二区美女诱惑| 成人丝袜视频网| 99精品欧美一区| 欧美日韩在线亚洲一区蜜芽| 欧美丰满少妇xxxxx高潮对白| 日韩一区二区在线观看视频| 精品久久国产老人久久综合| 国产欧美中文在线| 中文字幕色av一区二区三区| 亚洲一区自拍偷拍| 美腿丝袜在线亚洲一区| 国产精品亚洲一区二区三区妖精 | 欧美一区二区三级| 精品播放一区二区| 亚洲欧洲另类国产综合| 亚洲va韩国va欧美va精品| 久久成人免费网| 不卡免费追剧大全电视剧网站| 91国产丝袜在线播放| 欧美一区二区三区精品| 国产日韩欧美精品电影三级在线| 亚洲免费在线视频| 欧美色窝79yyyycom| 成人a区在线观看| 欧美色男人天堂| 精品国产网站在线观看| 亚洲色大成网站www久久九九| 日韩福利视频导航| 99久久精品国产一区二区三区| 欧美日韩www| 日本一区二区成人| 日本不卡一区二区| 91色.com| 久久久精品国产免大香伊| 亚洲一区在线观看视频| 成人深夜福利app|