0

我使用第二个块代码来查找位图的偶数和奇数列,以便在位图中构建方格页面我使用了我的 IsEven() 和 IsOdd() 函数

我想用 lockbits 完成这项工作:

public unsafe void DrawCheckeredPage()
    {
        Bitmap bmpShati = null;
        bmpShati = new Bitmap(@"\ColorReductedBMP.bmp");
        Color GrayOne = Color.FromArgb(153, 153, 153);
        Color WhiteOne = Color.FromArgb(255, 255, 255);

        for (int x = 0; x < bmpShati.Width; x++)
        {
            for (int y = 0; y < bmpShati.Height; y++)
            {
                Color PreCol = bmpShati.GetPixel(x, y);
                if (OmitedPictureBoxes.Exists(item => (Color)item.Tag == PreCol))
                {
                    if (IsEven(x) && IsEven(y))
                    {
                        bmpShati.SetPixel(x, y, GrayOne);
                    }
                    else if (IsOdd(x) && IsOdd(y))
                    {
                        bmpShati.SetPixel(x, y, GrayOne);
                    }
                    else if (IsEven(x) && IsOdd(y))
                    {
                        bmpShati.SetPixel(x, y, WhiteOne);
                    }
                    else if (IsOdd(x) && IsEven(y))
                    {
                        bmpShati.SetPixel(x, y, WhiteOne);
                    }
                }
            }

        }
        bmpShati = resizeBitmap2(bmpShati, newW, newH);
        pbMain.Invoke((Action)(() => pbMain.Image = bmpShati));
    }

但是有一个问题,即 Checkered 页面绘制不正确,我使用 GetPixel() 和 SetPixel 进行了绘制,但我必须使用 LockBits,您能帮帮我吗?

这是我的代码:

public unsafe void DrawCheckeredPage()
        {
            Bitmap bmpShati = null;
            bmpShati = new Bitmap(@"\ColorReductedBMP.bmp");
            Rectangle rect = new Rectangle(0, 0, bmpShati.Width, bmpShati.Height);
            var _bdata = bmpShati.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb);
            var _ptr = (byte*)_bdata.Scan0;
            int _numBytes = _bdata.Stride * _bdata.Height, row, col;
            for (int i = 0; i < _numBytes; i += 4)
            {
                Color PreCol = Color.FromArgb(
                    (*(_ptr + i + 2)),
                    (*(_ptr + i + 1)),
                    (*(_ptr + i))
                    );
                if (OmitedPictureBoxes.Exists(item => (Color)item.Tag == PreCol))
                {
                    row = i / _bdata.Stride;
                    col = i % _bdata.Stride;
                    if (IsEven(row) && IsEven(col))
                    {

                        (*(_ptr + i + 2)) = Convert.ToByte(153);
                        (*(_ptr + i + 1)) = Convert.ToByte(153);
                        (*(_ptr + i)) = Convert.ToByte(153);

                    }
                    else if (IsOdd(row) && IsOdd(col))
                    {
                        (*(_ptr + i + 2)) = Convert.ToByte(153);
                        (*(_ptr + i + 1)) = Convert.ToByte(153);
                        (*(_ptr + i)) = Convert.ToByte(153);

                    }
                    else if (IsEven(row) && IsOdd(col))
                    {
                        (*(_ptr + i + 2)) = Convert.ToByte(255);
                        (*(_ptr + i + 1)) = Convert.ToByte(255);
                        (*(_ptr + i)) = Convert.ToByte(255);
                    }
                    else if (IsOdd(row) && IsEven(col))
                    {
                        (*(_ptr + i + 2)) = Convert.ToByte(255);
                        (*(_ptr + i + 1)) = Convert.ToByte(255);
                        (*(_ptr + i)) = Convert.ToByte(255);
                    }
                }
            }
            bmpShati.UnlockBits(_bdata);
            bmpShati = resizeBitmap2(bmpShati, newW, newH);
            pbMain.Invoke((Action)(() => pbMain.Image = bmpShati));
        }
        public bool IsOdd(int value)
    {
        return value % 2 != 0;
    }
    public static bool IsEven(int value)
    {
        return value % 2 == 0;
    }
4

0 回答 0