Parallelizing bitmap methods
By using BitConverter.ToInt32 you can simplify the GetPixel() method to  

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Color GetPixel(int x, int y)
{
    return Color.FromArgb(BitConverter.ToInt32(bytes, y * stride + x * 4));
}


Also there is no need to place () arround the multiplications because they will be done first.  



Because GetPixel and SetPixel are public you should add some validation to them. This can be done by adding a private method GetPosition() like  

private int GetPosition(int x, int y)
{
    if (x &gt; stride) { throw new ArgumentOutOfRangeException("x"); }

    int position = y * stride + x * 4;

    if (position &gt;= bytes.Length) { throw new ArgumentOutOfRangeException("y"); }
    return position;
}


now the changed GetPixel() method looks like  

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Color GetPixel(int x, int y)
{
    return Color.FromArgb(BitConverter.ToInt32(bytes, GetPosition(x, y)));
}




Basically you don't need the Color to determine if a pixel is black or white. You can just check if the argb value of that pixel matches the values for Color.Black or Color.White like   

private const int black = -16777216;
private const int white = -1;

public bool IsBlackAndWhite(int x, int y)
{
    int argb = BitConverter.ToInt32(GetPosition(x, y));
    return argb == white || argb == black;
}




You should let your variables some space to breathe.  


for(int j=0; j&lt;Height; j++)  



should be  

for(int j = 0; j &lt; Height; j++)  


Your IDE will usually have a keyboard shortcut for formatting the code.  



Declaring multiple variables in one line makes your code less readable.