У меня есть какой-то устаревший код C / C ++, который я пытаюсь быстро интегрировать в мой GUI (CLI не подходит из-за сложности и временных ограничений). Это постоянно выводит изображение на ~15fps
с камеры. Моя идея состояла в том, чтобы записать изображения на диск и прочитать их из моей программы с графическим интерфейсом, который использует C # и WPF. Изображение, записываемое на твердотельный накопитель, имеет формат JPEG (хотя я мог бы изменить это в устаревшем коде) и иметь размер всего 240 КБ, поэтому с точки зрения производительности это не должно быть проблемой.
Моя первоначальная попытка состояла в том, чтобы связать источник изображения с именем файла изображения внутри ViewModel
а затем использовать RaisePropertyChanged
в графический интерфейс для обновления изображения. К сожалению, это не работает. Судя по отладке унаследованного кода, это связано с тем, что мой код C # GUI блокирует файл изображения, и поэтому унаследованная программа больше не может писать в него. Я также нашел тему в SO, предполагая, что это проблема.
Так есть ли способ достичь того, что я пытаюсь сделать? Я смотрел на ImageSource
а также BitmapSource
, поскольку они должны позволять мне читать файл неблокирующим образом. Но я не мог понять, как интегрировать их в качестве источника в мой ViewModel
, так как они являются абстрактными классами, и я получаю ошибку Cannot create an instance of the abstract class of interface
,
Буду благодарен за любые предложения. Пример кода, конечно, был бы потрясающим. Вот мой код:
ViewModel:
public class CameraViewModel : ViewModelBase
{
private string imageSource;
public string ImageSource
{
get { return imageSource; }
set {
if (!(value == imageSource))
{
imageSource = value;
RaisePropertyChanged("ImageSource");
}
}
}
public CameraViewModel()
{
string fileName = @"./CurrentImage.jpg";
ImageSource = fileName;
Task.Factory.StartNew(() =>
{
while (true)
{
RaisePropertyChanged("ImageSource");
Thread.Sleep(33);
}
});
}
}
Посмотреть:
<UserControl x:Class="ProgramEditor.Views.CellCameraView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="300"DataContext="{Binding Camera_VM, Source={StaticResource Locator}}">
<Image Name="CameraImage" Height="150" Width="200" Stretch="Fill" Source="{Binding ImageSource}" />
</UserControl>
Код для написания изображения в устаревшем коде. DeleteFile
-отзывы были добавлены в целях отладки:
void WriteCurrentImage(BYTE * pBuffer)
{
bool rc;
currentimage = cvCreateImageHeader(cvSize(VideoWidth, VideoHeight),IPL_DEPTH_8U, 1);
currentimage->imageData = (char*)pBuffer;
rc = DeleteFile( "./CurrentImage_tmp.jpg" ); // to test file access
cout << "DeleteFile(CurrentImage_tmp) rc:" << rc << endl; // rc = 1; works
cvSaveImage("./CurrentImage_tmp.jpg" ,currentimage);
rc = DeleteFile( "./CurrentImage.jpg" ); // to test file access
cout << "DeleteFile(CurrentImage) rc:" << rc << endl; // rc = 0; fails
MoveFile("./CurrentImage_tmp.jpg","./CurrentImage.jpg");
cout << "WriteCurrentImage(pBuffer); called." << endl;
}
Задача ещё не решена.
Других решений пока нет …