El problema es que creas tu matriz (buffer) con el tamaño de los datos recibidos hasta el momento de (int bytes = serialPort1.BytesToRead;), con esta ultima instrucción obtienes el numero de bytes almacenados hasta el momento en el buffer de entrada del puerto y lo que te está pasando es que después de esa instrucción ahun siguen llegando datos de la imagen que tu ya no recoges.
Soluciones varias:
Puedes, antes de enviar la imagen, enviar el tamaño de esta, creas una matriz del tamaño recibido (no uses int, usa algo mas grande como long) y después en un ciclo for ir almacenando los datos recibidos al bufer hasta llegar al tamaño recibido.
Si no quieres/puedes enviar el tamaño:
Viendo que haces uso de memorysteam puedes hacer uso desde el principio con el, algo asi:
MemoryStream ms = new MemoryStream();
while(serialPort1.BytesToRead >0)
{
ms.WriteByte(serialPort1.ReadByte());
}
Bitmap imagen = new Bitmap(ms);
pictureBox1.Image = imagen;
return imagen;
De esta última manera es raro pero podría llegar a pasar que el buffer llegara a 0 y se saliera del ciclo while sin haber llegado a terminarse de leer el archivo pero eso tiene facil solución, ya te lo dejo a ti si ves que te pasa.
Por otro lado hay mas y seguro que mejores soluciones, estas son las 2 primeras que se me han ocurrido asi pensandolo rapido.
Un saludo