C grayscale image instance code

  • 2020-05-19 05:35:51
  • OfStack

The pseudo-statement can be expressed as follows

public bitmap GrayScal(bitmap orgbmp)
{
Create an 8-bit image as large as the original image
Take every point in the original image
The point of the new image = the red quantity * coefficient of the original image * coefficient 1+ green quantity * coefficient 2+ yellow quantity * system 3
Go back to the new image
}


/// <summary>
    ///  I'm going to dot the image ,
    /// </summary>
    public class PointTrans
    {
        private readonly double cb;
        private readonly double cg;
        private readonly double cr;
        /// <summary>
        ///  Do some operation , To give every 1 A partial quantity , do 1 Set up under the , For example, the grayscale of the image needs to be set 
        /// </summary>
        /// <param name="cr"></param>
        /// <param name="cg"></param>
        /// <param name="cb"></param>
        public PointTrans(double cr, double cg, double cb)
        {
            this.cr = cr;
            this.cg = cg;
            this.cb = cb;
        }
        public  Bitmap GrayScaleBmp(Bitmap orgData)
        {
            int bmpWidth = orgData.Width, bmpHeight = orgData.Height;
            Bitmap destData = ImageTools.CreateGrayscaleImage(bmpWidth, bmpHeight);
            Rectangle bmpRect=new Rectangle(0,0,bmpWidth,bmpHeight);
            BitmapData orgBmpData = orgData.LockBits(bmpRect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
            BitmapData destBmpData = destData.LockBits(bmpRect, ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            ProcessFilter(orgBmpData,destBmpData);
            orgData.UnlockBits(orgBmpData);
            destData.UnlockBits(destBmpData);
            return destData;
        }

        protected unsafe void ProcessFilter(BitmapData sourceData, BitmapData destinationData)
        {
            // get width and height
            int width = sourceData.Width;
            int height = sourceData.Height;
            int srcOffset = sourceData.Stride - width*3;
            int dstOffset = destinationData.Stride - width;
            // do the job
            byte* src = (byte*) sourceData.Scan0.ToPointer();
            byte* dst = (byte*) destinationData.Scan0.ToPointer();
            // for each line
            for (int y = 0; y < height; y++)
            {
                // for each pixel
                for (int x = 0; x < width; x++, src += 3, dst++)
                {
                    *dst = (byte) (cr*src[RGB.R] + cg*src[RGB.G] + cb*src[RGB.B]);
                }
                src += srcOffset;
                dst += dstOffset;
            }
        }

    }


Related articles: