This is a copy/paste from my answer here: RGB-frame encoding - FFmpeg/libav
lets look at the colorspace conversion.
void YUVfromRGB(double& Y, double& U, double& V, const double R, const double G, const double B)
{
Y = 0.257 * R + 0.504 * G + 0.098 * B + 16;
U = -0.148 * R - 0.291 * G + 0.439 * B + 128;
V = 0.439 * R - 0.368 * G - 0.071 * B + 128;
}
And plug in some dummy values:
R = 255, G = 255, B = 255
Y = 235
R = 0, G = 0, B = 0
Y = 16
As you can see, the range 0 -> 255 is squished to 16 -> 235. Thus we have shown that there are some colors in the RGB colorspace that do not exist in the (digital) YUV color space. Hence the conversion is lossy by definition.