C# UWP-图像不';当它引用的图像文件发生更改时,不能更改内容
我正在尝试拍摄视频快照并用滚动条预览它。假设我们有C# UWP-图像不';当它引用的图像文件发生更改时,不能更改内容,c#,uwp,C#,Uwp,我正在尝试拍摄视频快照并用滚动条预览它。假设我们有bohemian.mp4,我的应用程序将在某个点拍摄快照并保存到bohemian.png。这是前面提到的部分 xaml: public CommandEventHandler<double> UpdateSnapshotCmd { get { return new CommandEventHandler<double>(
bohemian.mp4
,我的应用程序将在某个点拍摄快照并保存到bohemian.png
。这是前面提到的部分
xaml:
public CommandEventHandler<double> UpdateSnapshotCmd
{
get
{
return new CommandEventHandler<double>(
async (second) => await UpdateSnapshotPreview(second)
);
}
}
public async Task UpdateSnapshotPreview(double second)
{
try
{
if (mp4 == null)
{
mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
}
var imgName = Path.ChangeExtension(mp4.Name, ".png");
StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);
MediaComposition mediaComposition = new MediaComposition();
MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
mediaComposition.Clips.Add(mediaClip);
var interval = TimeSpan.FromSeconds(second);
var thumbnail = await mediaComposition.GetThumbnailAsync(interval,
1024, 768, VideoFramePrecision.NearestKeyFrame);
using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
using (var destStream = randomAccess.AsStream())
using (var sourceStream = thumbnail.AsStream())
{
await sourceStream.CopyToAsync(destStream);
}
mp3ViewerModel.ImagePath = imgFile.Path;
}
catch (Exception ex)
{
await new MessageDialog(ex.Message).ShowAsync();
}
}
出于调试目的,我会让按钮
处理我的命令
查看模型:
public CommandEventHandler<double> UpdateSnapshotCmd
{
get
{
return new CommandEventHandler<double>(
async (second) => await UpdateSnapshotPreview(second)
);
}
}
public async Task UpdateSnapshotPreview(double second)
{
try
{
if (mp4 == null)
{
mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
}
var imgName = Path.ChangeExtension(mp4.Name, ".png");
StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);
MediaComposition mediaComposition = new MediaComposition();
MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
mediaComposition.Clips.Add(mediaClip);
var interval = TimeSpan.FromSeconds(second);
var thumbnail = await mediaComposition.GetThumbnailAsync(interval,
1024, 768, VideoFramePrecision.NearestKeyFrame);
using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
using (var destStream = randomAccess.AsStream())
using (var sourceStream = thumbnail.AsStream())
{
await sourceStream.CopyToAsync(destStream);
}
mp3ViewerModel.ImagePath = imgFile.Path;
}
catch (Exception ex)
{
await new MessageDialog(ex.Message).ShowAsync();
}
}
当我选中保存的文件夹时,
png
文件被更改为Slider.Value
但应用程序中的Image
只响应了一次。如何修复此问题?我认为,因为文件路径保持不变,所以导致图像的行为相同,尽管内容不同或OnPropertyChanged
调用不同
因此,我在视图模型中找到了一个解决方案:
public CommandEventHandler<double> UpdateSnapshotCmd
{
get
{
return new CommandEventHandler<double>(
async (second) => await UpdateSnapshotPreview(second)
);
}
}
public async Task UpdateSnapshotPreview(double second)
{
try
{
if (mp4 == null)
{
mp4 = await StorageFile.GetFileFromPathAsync(mp4Path);
}
var imgName = Path.ChangeExtension(mp4.Name, ".png");
StorageFile imgFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName, CreationCollisionOption.ReplaceExisting);
MediaComposition mediaComposition = new MediaComposition();
MediaClip mediaClip = await MediaClip.CreateFromFileAsync(mp4);
mediaComposition.Clips.Add(mediaClip);
var interval = TimeSpan.FromSeconds(second);
var thumbnail = await mediaComposition.GetThumbnailAsync(interval,
1024, 768, VideoFramePrecision.NearestKeyFrame);
using (var randomAccess = await imgFile.OpenAsync(FileAccessMode.ReadWrite))
using (var destStream = randomAccess.AsStream())
using (var sourceStream = thumbnail.AsStream())
{
await sourceStream.CopyToAsync(destStream);
}
mp3ViewerModel.ImagePath = imgFile.Path;
}
catch (Exception ex)
{
await new MessageDialog(ex.Message).ShowAsync();
}
}
StorageFile imgFile=wait ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName,
CreationCollisionOption.ReplaceExisting);
改为:
StorageFile imgFile=wait ApplicationData.Current.TemporaryFolder.CreateFileAsync(imgName,
CreationCollisionOption.GenerateUniqueName);
但是,这将创建一堆png
,看起来很难看。我想知道是否有任何替代解决方案可以重复使用第一个也是唯一的png
?使用a来监视文件的更改:这是正确的,我建议使用解码图像绑定到视图,这样您也不必将图像保存到文件,只需创建一个图像源变量并为其赋值并绑定相同的值,这样当滑块更改时,图像源可以直接更新,而无需保存到文件