- Home /
Using EncodeToPNG to save an image to disk
I'm trying to load a sprite from the Resources folder, create a copy of a sprite's Texture2D, and save that data to disk as a png file. Here is what I've got so far:
Sprite itemBGSprite = Resources.Load<Sprite>( "_Defaults/Item Images/_Background" );
Texture2D itemBGTex = itemBGSprite.texture;
byte[] itemBGBytes = itemBGTex.EncodeToPNG();
BinaryFormatter bf = new BinaryFormatter();
FileStream file = File.Create( formattedCampaignPath + "/Item Images/Background.png" );
bf.Serialize( file , itemBGBytes );
file.Close();
This succeeds in creating a file called Background.png in the correct folder in the correct location; however, the file turns out 1 KB in size and corrupted.
My assumption is that the issue lies with EncodeToPNG--however, all of the answers here about EncodeToPNG seem to be years out-of-date, and the page ostensibly documenting the EncodeToPNG method no longer exists. Am I doing something wrong here? Is there some new alternative to EncodeToPNG that I should be using instead?
Answer by Sinister-Design · Oct 31, 2018 at 06:35 PM
Oh, wait--I totally figured it out. The issue was with using FileStream and BinaryFormatter, not EncodeToPNG. This new (much tighter) code totally works!
Sprite itemBGSprite = Resources.Load<Sprite>( "_Defaults/Item Images/_Background" );
Texture2D itemBGTex = itemBGSprite.texture;
byte[] itemBGBytes = itemBGTex.EncodeToPNG();
File.WriteAllBytes( formattedCampaignPath + "/Item Images/Background.png" , itemBGBytes );
Answer by syscrusher · May 04, 2021 at 02:29 PM
The image encoding and decoding methods for PNG, JPG, EXR, and Targa are implemented via the ImageConversion class as extensions to Texture2D. They are thus documented on a separate page.
I am not sure which Unity version made this change, but this accounts for the OP's difficulty in finding the documentation.
Your answer
Follow this Question
Related Questions
How to save a RenderTexture as a 1-channel 8-bit grayscale PNG? 0 Answers
EncodetoPNG and all other file types leaves the image in the wrong color space 0 Answers
Can a Texture2D be created at runtime from a snapshot of a RenderTexture? 3 Answers