将图像加载为 Texture2D

Posted

技术标签:

【中文标题】将图像加载为 Texture2D【英文标题】:Loading an image as Texture2D 【发布时间】:2015-07-02 13:39:10 【问题描述】:

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

static public string generatePhotoName (string cameraName, float time)

    return "G:/Data/unity/cameraDemo/" + 
        DataController.measurmentPath + 
        "/photos" + "/" + 
        cameraName + "/" + 
        time.ToString () + "_" + cameraName + ".png";

这可以很好地保存,但是当我尝试加载图像时,File.Exists (filePath)returns 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;
`

// edit2:更多代码

这就是我所说的方法 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);
    

【问题讨论】:

你在哪里加载文件?路径也应该有 @"\" 或 "\\" 而不是 "/"。 最后我会得到一批图像作为文件,我必须将它们加载到我的程序中。如所写,我将斜杠改为反斜杠,但没有帮助。 generatePhotoName的第二个版本甚至可以使用“/”! 你能告诉我们第一个版本的方法返回的字符串吗? @TheodorosChatzigiannakis G:/Data/unity/cameraDemo/demo/photos/Camera/2.46422_Camera.png 您能否发布与您的问题相关的所有内容。包括加载。 【参考方案1】:

问题是,我试图在一个Update()-call 中保存和加载屏幕截图。

我通过将其更改为右键单击以获取并保存屏幕截图并单击左键以加载屏幕截图来修复它。

【讨论】:

如果您已经解决了问题,您可以接受自己的答案,这样问题就不会在列表中显示为未回答(这通常意味着“仍在寻找答案” )。【参考方案2】:

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

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 = @"screenshots\"+cameraName+@"\";

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

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

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

【讨论】:

我试试看。感谢到目前为止。我以前看过这个@“\”并读到它类似于“\\”但我不知道它叫什么。你能告诉我,让我查一下吗? 它被称为逐字字符串文字。这意味着完全按原样(逐字)使用此字符串,不要尝试解释 \n \t 等字符。 我不想将纹理应用到任何对象。我只需要在每个屏幕截图中读取一些像素。每当我单击时,程序应该截取屏幕并将单击的点保存在世界坐标中。稍后我想在屏幕截图中找到一个匹配的像素,并将保存的点染成正确的颜色。

以上是关于将图像加载为 Texture2D的主要内容,如果未能解决你的问题,请参考以下文章

如何将聊天中的加载图像替换为使用 ReactJS 上传到 Firebase 存储的图像?

将背景图像加载为视图时出现小的白色间隙

按钮图像加载为白色?

python使用openCV图像加载(转化为灰度图像)平滑图像处理就是将每个像素的值变换为其相邻元素的平均值可视化平滑处理之后的图像(Blurring Images)

将按钮调用的图像加载到按钮的背景中[关闭]

当应用程序加载我的透明启动图像时,是不是有可能将主屏幕显示为背景?