How to share large image (Texture2d) across photon network?

In my mobile game, one user takes a picture and then shares it with all other players so that the image can be saved to the raw image on everyone's phones so they can vote on that image. I am doing this by converting the image to byte[] and calling an RPC for all that applies the texture to the raw image. However, the image seems to be too large of a file to share and it crashes the room and does not send. I am trying to find a solution to this by maybe saving the image to the cloud and loading it on other devices or serializing the raw image but I don't know how to do this. I am new to photon also. Can anyone please help me out to share the image across the network?

Here are the relevant parts of my script,
public class PlayerInfo : MonoBehaviourPun
     {
     public Text elimSelectText;
     public Player selectedPlayer;
     private Transform choosePlayersContainer;
     public AspectRatioFitter sharePhotoAspectFitter;
     public  NatSuite.Examples.MiniCam cam;
     public RawImage photoPanel;
     public PhotonView votePView;
     public Texture2D receivedTexture;
     public RawImage sharePhotoPanel;
     public GameObject voteElimPanel;
     private GameObject chooseListingPrefab;
 
       private void Update(){
              if(cam.isCapturing){            
             cam.isCapturing=false;
             openElimSelect();
         }  
         }
         
         public void openElimSelect(){
             photoPanel.texture = cam.previewTexture;
             photoAspectFitter.aspectRatio = cam.previewTexture.width / (float)cam.previewTexture.height;
             elimSelectHold.SetActive(true);
             listPlayersToChoose();
         }
 
 
  public void openElimSelect(){
         photoPanel.texture = cam.previewTexture;
         photoAspectFitter.aspectRatio = cam.previewTexture.width / (float)cam.previewTexture.height;
 
         elimSelectHold.SetActive(true);
         listPlayersToChoose();
     }
     void listPlayersToChoose(){
         foreach(Player player in PhotonNetwork.PlayerList){
            if(getAlive(player)){
                 GameObject tempListing = Instantiate(chooseListingPrefab, choosePlayersContainer);
                 Text tempText = tempListing.transform.GetChild(0).GetComponent<Text>();
                 tempText.text = player.NickName;
                 Button button= tempListing.gameObject.GetComponent<Button>();
                 button.onClick.AddListener(()=>{
                     votePView.RPC("selectedPlayerForVote", RpcTarget.All, player, cam.previewTexture.EncodeToPNG(), cam.previewTexture.width, cam.previewTexture.height);
                     elimSelectHold.SetActive(false);
                     ClearElimSelectPlayerListings();
                     Texture2D.Destroy(cam.previewTexture);
                 });    
             }   
         }
     }
 [PunRPC]
     private void selectedPlayerForVote(Player player, byte[] receivedByte, int width, int height){
         selectedPlayer = player;
         receivedTexture = new Texture2D(1, 1);
         receivedTexture.LoadImage(receivedByte);        
         sharePhotoPanel.texture =  receivedTexture;
         sharePhotoAspectFitter.aspectRatio = width / (float)height;
         isVoting = true;
         elimSelectText.text = "Is this " + player.NickName + "?";
         voteElimPanel.SetActive(true);
     }

Comments

  • hi, @adagne16

    best way is to use external storage.
    otherwise I would recommend you to add file size limit. This is always good because unlimited size can be abused to crush other devices

    sending as byte[] is fine however you have to split your file in small chunks - 10-16 KB and send. also it would be good if you will control send rate on client that sends data. so that others are not overwhelmed - 200 KB per second should be good

    best,
    ilya
  • adagne16
    adagne16
    edited March 2021
    Hi, @chvetsov

    Thank you for clearing this up for me. Do you have any suggestions on where to start for external cloud storage?

    Also, right now, I created a 000webhost account and created a php file that works with a wwwform in unity so I can upload the image. My problem is that it takes more than 10 seconds to upload and probably more to load it in.
  • hi, @adagne16

    No, I do not have any suggestions.

    best,
    ilya
  • patischof
    patischof
    edited October 2021

    You could try just cropping the photo, have you tried that method? The easiest way is to crop the image, that way it`ll get another format. So you don't have to convert anything at all. You can also try cropping in image upscaler online. Very simple and user-friendly program, I edit all my photos in it. The quality of all photos is retained. Then the image will weigh less and you can convert it to another format if you want. Also you can try to change the code, but for me this`s the most inconvenient one – as you need programming skills. I won`t give an example of codes, cause you can easily find them in the net.