是否有从 Image 对象获取文件名的函数

Is there a function that takes a filename from the Image object

我正在使用 Movie Maker Library Timeline SDK Control 6.0 dll 要添加照片,您需要一个文件名字符串。到目前为止一切都很好 但是我想插入一个获取图像对象的函数 但是该库没有连接 IMAGE 对象的功能 我需要的是从图像对象中获取文件名 即:string fileName = image

  Image img = default;
            using (WebClient client = new WebClient())
            {
                string url = textBox1.Text;
                Stream stream = client.OpenRead(url);
                img = Image.FromStream(stream);
                axTimelineControl1.AddImageClip(trackIndex: 1, fileName :img.ToString(),
                    clipStartTime: axTimelineControl1.GetMediaDuration(img.ToString()), clipStopTime: 4);
            }

你有点 "XY problem" -- 你问错了问题。您的 axTimelineControl1 需要图像的文件名。这意味着它 期望有一个图像以该文件名保存到磁盘。

但是您所拥有的只是一个远程图像,在一些 URL 后面。 client.OpenRead(url) 将图像下载到 Stream,但您不能直接对其进行任何操作。

因此,您不想拍摄该图像并将其放入 WinForms Image 对象中。相反,您想使用文件名将该图像保存到磁盘,然后将该文件名提供给您的 axTimelineControl1.

您有几种选择:

1) 你可以把从 client.OpenRead() 得到的 Stream 变成 FileStream 并保存到磁盘。
2) 你可以使用 WebClient 将图片直接下载到磁盘,然后将图片的文件名指定给 axTimelineControl1.

让我们改为执行 2)。它将节省一些步骤。

首先,创建文件。

string fileName = System.IO.Path.GetTempFileName();
System.IO.File.Create(fileName).Close();

我们正在此处创建一个 "Temp" 文件——这些文件将被视为一次性文件。请注意 Windows 不会为您清理它们,因此一旦您完成了它,您的程序应该将其删除。 System.IO.File.Create() 给了我们一个 FileStream 对象,但我们不需要它,所以我们马上 Close() 它,这样 WebClient 就可以写入我们的文件.

接下来,我们下载图像,并告诉 WebClient 将其保存到我们新创建的临时文件中:

// Defining my own URL here. Feel free to substitute your own.
string url = "https://derpicdn.net/img/view/2018/5/18/1735426.jpeg";
 using (var client = new WebClient())
{
     client.DownloadFile(url, fileName);
}

现在我们在磁盘上有一个图像,我们可以告诉 Movie Maker SDK 控件在哪里可以找到它:

float duration = axTimelineControl1.GetMediaDuration(fileName);
axTimelineControl1.AddImageClip(
     trackIndex: 1,
     fileName: fileName,
     clipStartTime: duration,
     clipStopTime: 4);

这样就可以了。

整个代码清单:

string fileName = System.IO.Path.GetTempFileName();
System.IO.File.Create(fileName).Close();

// Defining my own URL here. Feel free to substitute your own.
string url = "https://derpicdn.net/img/view/2018/5/18/1735426.jpeg";
using (var client = new WebClient())
{
     client.DownloadFile(url, fileName);
}

float duration = axTimelineControl1.GetMediaDuration(fileName);
axTimelineControl1.AddImageClip(
     trackIndex: 1,
     fileName: fileName,
     clipStartTime: duration,
     clipStopTime: 4);

别忘了清理临时文件!