In general, the blockchain is not meant to save a lot of data. Data storage in ethereum is quite expensive. One approach would be to save a hash of the data in the blockchain and store the actual data in a database or on IPFS or Swarm. It is definitely a good idea to keep images outside the blockchain. If you store images in IPFS or Swarm, you will get a hash of the data and you would store the hash in the blockchain. Since the hash is calculated based on the actual data of the image, you can also make sure that the image was not changed after you stored it.
The right approach to sync between the two sources is to use events. You can define events in your smart contracts. When you call a function of the smart contract, the event will be fired. You can catch the events in your application. If the transaction was successful, you can write the data to your database or to IPFS/Swarm.
This is more like a general explanation. If you need detailed guidance on how to implement this kind of approach, you can write a comment and I will post some links where you can find the detailed information.
I hope that helps.