C# 将图像加载为纹理2D

C# 将图像加载为纹理2D,c#,unity3d,texture2d,C#,Unity3d,Texture2d,在我的程序中,我想保存一些屏幕截图,然后加载它们来计算一些东西。我创建了一个方法来计算图像名称: static public string generatePhotoName (string cameraName, float time) { return "G:/Data/unity/cameraDemo/" + DataController.measurmentPath + "/photos" + "/" + cameraName

在我的程序中,我想保存一些屏幕截图,然后加载它们来计算一些东西。我创建了一个方法来计算图像名称:

static public string generatePhotoName (string cameraName, float time)
{
    return "G:/Data/unity/cameraDemo/" + 
        DataController.measurmentPath + 
        "/photos" + "/" + 
        cameraName + "/" + 
        time.ToString () + "_" + cameraName + ".png";
}
这对保存很有效,但当我尝试加载图像时,
File.Exists(filePath)
返回
false

但当我硬编码文件路径时,加载也可以正常工作:

static public string generatePhotoName (string cameraName, float time)
{
    return "G:/Data/unity/cameraDemo/demo/photos/Camera/test.png";
}
它甚至可以与“真实”图像名称(即3.827817_Camera.png)一起使用

使用
Path.Combine(…)
并将“/”更改为“\”不会更改任何内容

//编辑:这是我的加载方法

static public Texture2D loadPhotoToTexture (string filePath)
{

    Texture2D tex = null;
    byte[] fileData;

    if (File.Exists (filePath)) {
        fileData = File.ReadAllBytes (filePath);
        tex = new Texture2D (2, 2);
        tex.LoadImage (fileData); //..this will auto-resize the texture dimensions.
    } else {
        Debug.Log (filePath + " does not exist");
    }
    return tex;
}`
//编辑2:再来点代码

这就是我所说的方法
Texture2D photo=DataController.loadPhotoToTexture(photoData.getFileName())

这是我的班级
PhotoData

public class PhotoData : BaseData
{
    private string _cameraName;

    public string cameraName {
    get { return _cameraName; }
    set { _cameraName = value; }
    }

    private float _time;

    public float time {
        get { return _time; }
        set { _time = value; }
    }

    public PhotoData ()
    {
    }

    public PhotoData (string cameraName, float time)
    {
        _cameraName = cameraName;
        _time = time;
    }

    public string getFileName ()
    {
        return PlayerController.generatePhotoName (_cameraName, _time);
    }
}

如果您想将图像存储到磁盘上的某个文件,而不是游戏文件夹结构中,请执行以下操作:创建一个文件夹,并存储其位置(文件路径)。例如:

string screenshotFileName = time.ToString () + "_" + cameraName + ".png"
string screenshotDirectory;
screenshotDirectory = @"C:\someFolder\anotherFolder\";
try { Directory.CreateDirectory(directory); }
catch (Exception e)
{ //you should catch each exception separately
   if (e is DirectoryNotFoundException || e is UnauthorizedAccessException)
       Debug.LogError("OMG PANIC");
}
FileInfo filepath = new FileInfo(screenshotDirectory+screenshotFileName);
if(filepath.Exists)
{
    //load the file
}
您还可以通过将screenshotDirectory更改为,简单地创建一个具有相对路径的文件夹,该文件夹将与您的可执行文件位于同一文件夹中
screenshotDirectory=@“屏幕截图\”+cameraName+@“\”

编辑: 您似乎正确加载了纹理。是否将其指定给材质的主纹理?您的代码在哪里遇到问题?例如,如果在要应用纹理的同一对象上运行此脚本:

this.GetComponent<Renderer>().material.mainTexture = loadedTexture;
this.GetComponent().material.mainTexture=loadedTexture;

此外,当您想要加载图像时,最好使用Resources文件夹,它使用正向斜杠,而不是斜杠。将您可能希望在运行时加载的所有内容存储在那里,并使用Resources.load()。

问题是,我试图在一次
Update()
-调用中保存并加载屏幕截图


我将其更改为右键单击以拍摄并保存屏幕截图,左键单击以加载屏幕截图。您在哪里加载文件?路径也应该有@“\”或“\\”而不是“/”。最后,我会得到一批图像作为文件,我必须将它们加载到我的程序中。如前所述,我将斜杠改为反斜杠,但没有任何帮助。
generatePhotoName
的第二个版本甚至可以与“/”一起使用!你能给我们看一下这个方法的第一个版本返回的字符串吗?@Theodoroschatziganakis
G:/Data/unity/cameraDemo/demo/photos/Camera/2.46422_Camera.png
你能发布你的问题的所有相关信息吗。包括装货,我试试看。谢谢你。我以前见过这个@“\”并读过,它类似于“\”,但我不知道它叫什么。你能告诉我,这样我就可以查它了吗?它叫做逐字字符串文字。这意味着完全按原样使用此字符串(逐字),不要试图解释\n\t等字符。我不想将纹理应用于任何对象。我只需要读取每个屏幕截图中的一些像素。每当我点击时,程序都会截图并将点击点保存在世界坐标中。稍后,我想在屏幕截图中找到一个匹配的像素,并将保存的点染成正确的颜色。如果你已经解决了问题,你可以接受自己的答案,这样问题就不会在列表中显示为未回答(这通常意味着“仍在寻找答案”)。