Check out the following code. It creates 3 graphics (PNGs).
1. using your original code
2. using PointToClient() conversion method of Form object
3. using PointToScreen() conversion method of Form object
The first two get the same rectangle area on my computer but the last one is shifted. Maybe you need to convert PointToScreen? Take a look at coords more closely and you should be able to figure it out. Run the code and compare what you get on different resolutions.
FYI -Mine was 1280 x 960 on a remote VM.
Image bmp = new Bitmap(panel1.Width, panel1.Height);
var gg = Graphics.FromImage(bmp);
var rect = panel1.RectangleToScreen(panel1.ClientRectangle);
gg.CopyFromScreen(rect.Location, Point.Empty, panel1.Size);
bmp.Save(@"C:\temp\test.jpg", ImageFormat.Jpeg);
Point p = this.PointToClient(new Point(panel1.ClientRectangle.X, panel1.ClientRectangle.Y));
Point p2 = this.PointToScreen(new Point(panel1.ClientRectangle.X, panel1.ClientRectangle.Y));
Size s = new Size(panel1.Width,panel1.Height);
Rectangle targetRect = new Rectangle(p,s);
Rectangle targetRect2 = new Rectangle(p2, s);
var rect1 = panel1.RectangleToScreen( targetRect );
var rect2 = panel1.RectangleToScreen(targetRect2);
gg.CopyFromScreen(targetRect.Location, Point.Empty, s);
bmp.Save(@"C:\temp\test1.jpg", ImageFormat.Jpeg);
gg.CopyFromScreen(targetRect2.Location, Point.Empty, s);
bmp.Save(@"C:\temp\test2.jpg", ImageFormat.Jpeg);
Graphics g = panel1.CreateGraphics();
g.Clear(Color.WhiteSmoke);