读取图片时,请参考bolg文章:C#图片的像素格式问题研究 (http://www.cnblogs.com/lixunwu/articles/6691962.html)
private unsafe void ProcessFilter(Bitmap imageT) { PixelFormat pixelFormat = imageT.PixelFormat; // get image dimension int width = imageT.Width; int height = imageT.Height; Rectangle rect = new Rectangle(0, 0, width, height); BitmapData image = new BitmapData(); image = imageT.LockBits(rect, ImageLockMode.ReadWrite, pixelFormat); // pixel value if ( (pixelFormat == PixelFormat.Format8bppIndexed) || (pixelFormat == PixelFormat.Format24bppRgb) || (pixelFormat == PixelFormat.Format32bppRgb) || (pixelFormat == PixelFormat.Format32bppArgb)) { // initialize other variables int pixelSize = (pixelFormat == PixelFormat.Format8bppIndexed) ? 1 : (pixelFormat == PixelFormat.Format24bppRgb) ? 3 : 4; int lineSize = width * pixelSize; int srcOffset = image.Stride - lineSize; // do the job byte* ptr = (byte*)image.Scan0.ToPointer(); // for each line for (int y = 0; y < height; y++) { // for each pixel for (int x = 0; x < lineSize; x++, ptr += pixelSize) { //ptr[0] ptr[1] ptr[2]
//int temp = *ptr; //countPixel[temp]++; //if (countPixel[temp] > maxPixel) //{ // maxPixel = countPixel[temp]; //} } ptr += srcOffset; } imageT.UnlockBits(image); ptr = null; imageT = null; image = null; }
// else 部分的代码未修正 else { // initialize other variables int pixelSize = ( pixelFormat == PixelFormat.Format16bppGrayScale ) ? 1 : ( pixelFormat == PixelFormat.Format48bppRgb ) ? 3 : 4; int lineSize = width * pixelSize; int srcStride = image.Stride; int ovrStride = overlay.Stride; // do the job byte* basePtr = (byte*) image.ImageData.ToPointer( ); byte* baseOvr = (byte*) overlay.ImageData.ToPointer( ); // for each line for ( int y = 0; y < height; y++ ) { ushort * ptr = (ushort*) ( basePtr + y * srcStride ); ushort * ovr = (ushort*) ( baseOvr + y * ovrStride ); // for each pixel for ( int x = 0; x < lineSize; x++, ptr++, ovr++ ) { // abs(sub) v = (int) *ptr - (int) *ovr; *ptr = ( v < 0 ) ? (ushort) -v : (ushort) v; } } }