TIdThreadSafeStringList is fantastic for strings. (Indy)
TThreadList (Classes) can work as a queue. A TJPEGImage would need to be created for each load and the main thread would free the object after it assigns it to a TImage.
In the past Ive used Indy's TIdThreadSafeStringList for sending string messages. TIdThreadSafeList extends TThreadList with Pop/Pull methods.
TIdThreadSafeObjectList extends TIdThreadSafeList with object ownership, which kicks in if you free the thread list before its empty.
But, im unsure why it would be needed here, unless you want to throttle the GUI renderings to a frame rate, which would mean, the thread loads JPEG's which arn't shown.
But, then that is more of a buffering feature, in which case you wouldn't use a queue. TThreadList would be a map of the frames and the JPEG's would come from another TThreadList which acts as a JPEG cache. Which would mean, JPEG's are never free-ed until the program ends. They just get reused.