I was thinking that would be easier, but it actually isn't quite.
One thing to note is that you can find the coordinates of the upper left corner of each grid cell. I suspect that keeping track of that might be convenient. It might not, too, because you can calculate it on the fly (you are calculating where the lines are on the fly, so calculating the upper left coordinate wouldn't be too hard, either), so there might not be any real advantage to holding those coordinates.
Beyond that, it's a matter of math, and I tend to get that stuff wrong the first time, so I'd want to be playing around with it. For one thing, you have this:
Code:
Dim p As Point = PointToClient(MousePosition)
txt_mousex.Text = (p.X - panel_preview.Left - PB_Back.Left) * _scale
txt_mousey.Text = (p.Y - panel_preview.Top - PB_Back.Top) * _scale
What's the client that you are getting the mouse to? You want the point to be in PB coordinates, and I'm not sure what the panel is doing in there. That seems wrong, to me, but are the coordinates in Panel coordinates, not PB coordinates?
Because I'm never fully clear which coordinates I'm looking at, I'd first want to put a breakpoint in the second line of that, then click in the upper left corner of the PB. The point should be really close to 0,0. If it is not, then you have the coordinates from the wrong context.
If you can calculate where PB 0,0 will be in the image (it would be image 0,0 at fully zoomed out, then somewhere else as you zoomed in), then you can calculate where any point will be in the image.