Get Image From Stream, TCP Stream without converting to MemoryStream first
my though is like this, though i didn't really test it


You must keep the stream open for the lifetime of the Image.  because the Image.FromStream  wont read the data until it needs it, for performance purpose;
you must make sure the all the data for that image is received before you call Image.FromStream. TCP could split your data into multiple packages when transfer.  since you transfer 4 bytes as the length of that image, you can read the length first, then you can keep checking the length of that NetworkStream, but do not read any data.  or you can peek the data but make sure the data is still in the stream;
the last condition, do not transfer more data after the image until you are done with the image. otherwise, the data after the image could be treated as the image data.  if it is hard for your current application's protocol, you might just use a separated tcp connection for image data only.


Update:

Or I think you can derived a class from System.Stream and override the Read method and some other methods as well.  Now you can manage how you read the data.  This way, you can even work on just the same TCp connection because you know the length.   Just pass that derived Stream to the Image.FromStream, that should/might work.