Tuesday, August 30, 2016

c# - save a particular area of the scene as screenshot in unity


I need to save a particular part of the scene as screenshot. I have done a sample to show the particular part of the scene.



When I click on the rectangular area the selected area will being shown on the screen on a texture (marked in red rectangle):



But when I save, the whole scene is getting saved but not the selected part:




Here is code:


Texture2D screencap;
Texture2D border;
bool shot=false;
public string path;

void Start () {
screencap=new Texture2D(300,200,TextureFormat.RGB24,false);
border=new Texture2D(2,2,TextureFormat.ARGB32,false);

border.Apply();
}

// Update is called once per frame
void Update () {
if(Input.GetKeyUp(KeyCode.Mouse0))
{
StartCoroutine("Capture");
}


}
string fileName(int width, int height)
{
return string.Format("screen_{0}x{1}_{2}.png",
width, height,
System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss"));
}

void OnGUI()
{

GUI.DrawTexture(new Rect(200,100,300,2),border,ScaleMode.StretchToFill);
GUI.DrawTexture(new Rect(200,300,300,2),border,ScaleMode.StretchToFill);
GUI.DrawTexture(new Rect(195,100,2,200),border,ScaleMode.StretchToFill);
GUI.DrawTexture(new Rect(500,100,2,201),border,ScaleMode.StretchToFill);

if(shot)
{
GUI.DrawTexture(new Rect(50,10,60,40),screencap,ScaleMode.StretchToFill);
//Application.CaptureScreenshot(myFolderLocation+myFilename);
}

}

IEnumerator Capture()
{
yield return new WaitForEndOfFrame();
screencap.ReadPixels(new Rect(198,98,298,198),0,0);
screencap.Apply();
shot=true;

byte[] bytes=border.EncodeToPNG();

string filename=fileName(Convert.ToInt32(screencap.width), Convert.ToInt32(screencap.height));
Application.CaptureScreenshot("D:"+filename);
}

How can I save only the particular part in unity,can anybody please help me out.



Answer



Your


Application.CaptureScreenshot("D:"+filename);

saves the whole shene on file, you need to save the texture2d to file



Follow the example:


 import System.IO;

function SaveTextureToFile( texture: Texture2D,fileName)
{
var bytes=texture.EncodeToPNG();
var file = new File.Open(Application.dataPath + "/"+fileName,FileMode.Create);
var binary= new BinaryWriter(file);
binary.Write(bytes);
file.Close();

}

Call it using:


      SaveTextureToFile( screencap,"picture.png");

EDIT: a variation of SaveTextureToFile can be:


     function SaveTextureToFile(  Texture2D texture ,string fileName)
{
byte[] bytes = texture.EncodeToPNG();
File.WriteAllBytes(filename, bytes);

}

No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...