25 #include "BVWXMainFrame.hh"
26 #include <Gui/FilterDialogMean.hh>
27 #include <Gui/FilterDialogGradientSobel3x3.hh>
28 #include <Gui/FilterDialogRescale.hh>
29 #include <Gui/FilterDialogGauss.hh>
30 #include <Gui/FilterDialogMedian.hh>
31 #include <Gui/FilterDialogCannyEdge.hh>
32 #include <Gui/wxVideoSettingsDialog.h>
33 #include <Utils/StringUtils.hh>
34 #include <Utils/ImageValueBar.hh>
35 #ifdef BIAS_HAVE_FFMPEG
36 #include <VideoSink/VideoSink_FFmpeg.hh>
38 #include <wx/printdlg.h>
39 #include <wx/string.h>
41 #include <wx/artprov.h>
42 #include <wx/aboutdlg.h>
43 #include <wx/progdlg.h>
48 typedef unsigned char UCHAR;
54 #if !defined(__WXPM__)
55 # include <img/biasviewwx.xpm>
56 # include <img/play.xpm>
57 # include <img/stopplaying.xpm>
129 : wxFrame((wxFrame*)NULL, BIAS::ID_WIN_BVWX_MAINFRAME, title, pos, size),
130 _ImageCanvasUC(NULL),
131 _ImageCanvasFloat(NULL),
133 _KeepScrollPositionCheckBox(NULL)
135 SetIcon(wxIcon(biasviewwx_xpm));
137 _DefaultFile = wxT(
"ucim.pgm");
138 _DefaultDir = wxT(
"");
139 _BlockAnimation =
true;
140 _SelectedChannel = 0;
141 _ShowImageValueBar =
false;
142 _ShowHistogramm =
false;
143 _HistoPosition = wxPoint(10,10);
144 _ValueBarPosition = wxPoint(150,10);
145 _HistoSize = wxSize(100,100);
146 _ValueBarSize = wxSize(200,300);
149 _Timer.SetOwner(
this, ID_Timer);
152 wxMenu* fileMenu =
new wxMenu;
153 fileMenu->Append(ID_Load,
154 wxT(
"&Open/Load...\tCtrl-O"),
155 wxT(
"Open a file from disk for loading"));
156 fileMenu->Append(ID_RemoveCurrent,
157 wxT(
"&Remove current image...\tCtrl-R"),
158 wxT(
"Remove current file from viewer list"));
159 fileMenu->Append(ID_RemoveAllButCurrent,
160 wxT(
"Remove &all but current image"),
161 wxT(
"Remove all files from viewer list "));
163 fileMenu->AppendSeparator();
165 fileMenu->Append(ID_Info, wxT(
"Image Info...\tCtrl-I"));
166 fileMenu->Append(ID_MetaData, wxT(
"Meta Data...\tCtrl-M"));
167 fileMenu->Append(ID_ImageValues, wxT(
"Image Values..."));
169 fileMenu->AppendSeparator();
171 fileMenu->Append(ID_SaveAs,
172 wxT(
"&Save image as\tAlt-S"),
173 wxT(
"Save image to disk"));
174 fileMenu->Append(ID_SaveCurrent,
175 wxT(
"&Save current image\tAlt-Ctrl-S"),
176 wxT(
"Save image as currently displayed with storage type unsigned char to disk."));
177 fileMenu->Append(ID_SaveList,
178 wxT(
"&Save images list to .lst file ...\tCtrl-S"),
179 wxT(
"save all list of all image filenames to .lst disk file."));
181 fileMenu->AppendSeparator();
182 fileMenu->Append(ID_SaveMovie,
183 wxT(
"Save images as movie"),
184 wxT(
"Save current images in list as movie to disk using ffmpeg."));
185 fileMenu->AppendSeparator();
196 fileMenu->Append(ID_Exit, wxT(
"E&xit"), wxT(
"Exit this application"));
200 wxMenu* helpMenu =
new wxMenu;
201 helpMenu->Append(ID_KeyInfo, wxT(
"&Keys...\tF1"));
202 helpMenu->Append(ID_About, wxT(
"&About...\tCtrl-F1"));
205 wxMenu* channelMenu =
new wxMenu;
206 channelMenu->Append(ID_ChangeChannel_ALL, wxT(
"&0 All Channels\tShift-F9"));
208 channelMenu->AppendSeparator();
210 channelMenu->Append(ID_ChangeChannel_1, wxT(
"&1 channel (red?)\tShift-F1"));
211 channelMenu->Append(ID_ChangeChannel_2, wxT(
"&2 channel (green?)\tShift-F2"));
212 channelMenu->Append(ID_ChangeChannel_3, wxT(
"&3 channel (blue?)\tShift-F3"));
213 channelMenu->Append(ID_ChangeChannel_4, wxT(
"&4 channel (alpha?)\tShift-F4"));
214 channelMenu->Append(ID_ChangeChannel_5, wxT(
"&5 channel (H for RGB)\tShift-F5"));
215 channelMenu->Append(ID_ChangeChannel_6, wxT(
"&6 channel (S for RGB)\tShift-F6"));
216 channelMenu->Append(ID_ChangeChannel_7, wxT(
"&7 channel (L for RGB)\tShift-F7"));
217 channelMenu->Append(ID_ChangeChannel_8, wxT(
"&8 channel\tShift-F8"));
219 wxMenu* viewMenu =
new wxMenu;
220 _DrawROICheckItem =
new wxMenuItem(viewMenu, ID_DrawROI, wxString(
221 wxT(
"Draw &ROI")), wxEmptyString, wxITEM_CHECK);
222 viewMenu->Append(_DrawROICheckItem);
223 _DrawROICheckItem->Check(
false);
225 _HistogramCheckItem =
new wxMenuItem(viewMenu, ID_Histogramm, wxString(
226 wxT(
"Show &Histogramm")), wxEmptyString, wxITEM_CHECK);
227 viewMenu->Append(_HistogramCheckItem);
228 _HistogramCheckItem->Check(
false);
230 _ValueBarCheckItem =
new wxMenuItem(viewMenu, ID_ImageValueBar, wxString(
231 wxT(
"Show &Legend")), wxEmptyString, wxITEM_CHECK);
232 viewMenu->Append(_ValueBarCheckItem);
233 _ValueBarCheckItem->Check(
false);
234 viewMenu->AppendSeparator();
235 viewMenu->Append( ID_Prev, wxT(
"&Previous \tCTRL-LEFT"));
236 viewMenu->Append( ID_Next, wxT(
"&Next \tCTRL-RIGHT"));
237 viewMenu->Append( ID_RunStop, wxT(
"&Run/Stop \tCTRL-SPACE"));
240 wxMenu* filterMenu =
new wxMenu;
241 filterMenu->Append(ID_FilterCannyEdge,
242 wxT(
"&Canny Edge\tAlt-Ctrl-C"),
243 wxT(
"Canny edge filter"));
244 filterMenu->Append(ID_FilterGauss,
245 wxT(
"&Gauss\tAlt-Ctrl-G"),
246 wxT(
"Gauss filter"));
247 filterMenu->Append(ID_FilterGradientSobel3x3,
248 wxT(
"G&radient Sobel 3x3\tAlt-Ctrl-R"),
249 wxT(
"Gradient sobel filter"));
250 filterMenu->Append(ID_FilterMean,
251 wxT(
"&Mean\tAlt-Ctrl-M"),
253 filterMenu->Append(ID_FilterMedian,
254 wxT(
"Me&dian\tAlt-Ctrl-D"),
255 wxT(
"Median filter"));
256 filterMenu->Append(ID_FilterRescale,
257 wxT(
"Resc&ale\tAlt-Ctrl-A"),
261 wxMenuBar* menuBar =
new wxMenuBar;
262 menuBar->Append(fileMenu, wxT(
"&File"));
263 menuBar->Append(channelMenu, wxT(
"&Channel"));
264 menuBar->Append(viewMenu, wxT(
"&View"));
265 menuBar->Append(filterMenu, wxT(
"Fil&ter"));
266 menuBar->Append(helpMenu, wxT(
"&Help"));
270 const int numFields = 3;
271 CreateStatusBar(numFields);
272 int widths[] = {30 * GetCharWidth(),-1, 60 * GetCharWidth()};
274 SetStatusWidths(numFields, widths);
275 SetStatusText(wxT(
"Welcome to BiasViewWX"), 0);
278 wxToolBar* toolBar = CreateToolBar(wxTB_HORIZONTAL | wxNO_BORDER |wxTB_TEXT,ID_ToolBar);
282 toolBar->SetToolBitmapSize(wxSize(24,24));
284 toolBar->AddTool( ID_Load, wxT(
"Open"),
285 wxArtProvider::GetIcon(wxART_FILE_OPEN,wxART_TOOLBAR), wxT(
"Open image(s)"));
286 toolBar->AddTool( ID_SaveCurrent, wxT(
"Save Current"),
287 wxArtProvider::GetIcon(wxART_FILE_SAVE,wxART_TOOLBAR),wxT(
"Save image as currently displayed with storage type unsigned char to disk.") );
288 toolBar->AddTool( ID_SaveAs, wxT(
"Save As"),
289 wxArtProvider::GetIcon(wxART_FILE_SAVE_AS,wxART_TOOLBAR),wxT(
"Save image with new filename.") );
291 toolBar->AddSeparator();
292 toolBar->AddTool( ID_Prev, wxT(
"Previous"),
293 wxArtProvider::GetIcon(wxART_GO_BACK,wxART_TOOLBAR),wxT(
"[Ctrl-LEFT] Previous") );
294 toolBar->AddTool( ID_Next, wxT(
"Next"),
295 wxArtProvider::GetIcon(wxART_GO_FORWARD,wxART_TOOLBAR), wxT(
"Next [Ctrl-RIGHT]") );
297 _RunTool = toolBar->AddTool( ID_RunStop, wxT(
"Run/Stop"), wxIcon(play_xpm), wxT(
"Run/Stop [Ctrl-SPACE]"));
304 toolBar->AddSeparator();
305 _ReverseCheckBox =
new wxCheckBox(toolBar, ID_ReverseLoop, wxT(
"Reverse"));
306 toolBar->AddControl(_ReverseCheckBox);
308 toolBar->AddSeparator();
309 wxSize sizeSize(60,25);
310 _DelaySpin =
new wxSpinCtrl(toolBar, ID_Delay, wxT(
"100"),
311 wxDefaultPosition, sizeSize,
312 wxSP_ARROW_KEYS, 1, 50000,100, wxT(
"Delay"));
313 toolBar->AddControl(_DelaySpin);
315 toolBar->AddSeparator();
317 _FitCheckBox =
new wxCheckBox(toolBar, ID_Fit, wxT(
"Fit Window"));
318 toolBar->AddControl(_FitCheckBox);
320 toolBar->AddSeparator();
322 _KeepScrollPositionCheckBox =
new wxCheckBox(toolBar,
323 ID_KeepScrollPosition,
324 wxT(
"Keep Position"));
325 toolBar->AddControl(_KeepScrollPositionCheckBox);
348 _MainSizer =
new wxBoxSizer(wxVERTICAL);
349 _SizerWindow =
new wxWindow(
this,-1);
351 _SizerWindow->SetSizer(_MainSizer);
354 std::vector<wxAcceleratorEntry> entries;
355 entries.push_back(wxAcceleratorEntry(wxACCEL_NORMAL,
'r', ID_RunStop));
356 entries.push_back(wxAcceleratorEntry(wxACCEL_NORMAL,
'h', ID_Histogramm));
358 wxAcceleratorTable accel(entries.size(), (wxAcceleratorEntry*)& entries[0] );
359 this->SetAcceleratorTable(accel);
365 BVWXMainFrame::~BVWXMainFrame() { }
368 void BVWXMainFrame::SetFileList(
const vector<string>& fileNames)
370 _FileNames = fileNames;
371 if (_FileNames.size() > 0)
373 LoadImageFromList(0);
389 ImageConvert::DeinterleaveHorizontal(tmp, image);
394 void BVWXMainFrame::LoadImageFromList(
int index)
396 if (_FileNames.size() == 0)
402 if(_ImageCanvasUC!=NULL){
403 _ImageCanvasUC->SetSize(5, 5);
404 _ImageCanvasUC->Destroy();
405 _ImageCanvasUC = NULL;
407 if(_ImageCanvasFloat!=NULL){
408 _ImageCanvasFloat->SetSize(5, 5);
409 _ImageCanvasFloat->Destroy();
410 _ImageCanvasFloat = NULL;
413 _SizerWindow->SetSize(5, 5);
414 _SizerWindow->Refresh();
415 _SizerWindow->Update();
430 _CurrentImage = index;
431 const string& fileName = _FileNames[index];
438 if (ImageIO::Load(fileName.c_str(), image)!=0)
441 msg <<
"Error loading " << fileName;
445 wxT(
"Loading Error"), wxOK | wxICON_EXCLAMATION);
454 UncompressImage(image);
460 case ImageBase::ST_unsignedchar:
467 case ImageBase::ST_float:
473 #ifdef BUILD_IMAGE_USHORT
474 case ImageBase::ST_unsignedshortint:
485 _MetaData = info.str();
491 bool histo_was_shown_for_float =
false;
492 bool valuebar_was_shown_for_float =
false;
495 if (_ImageCanvasFloat != NULL)
499 _HistoPosition = _ImageCanvasFloat->GetImageCanvas()->GetHistoPos();
500 _HistoSize = _ImageCanvasFloat->GetImageCanvas()->GetHistoSize();
502 _ValueBarSize = _ImageCanvasFloat->GetImageCanvas()->GetValueBarSize();
503 _ValueBarPosition = _ImageCanvasFloat->GetImageCanvas()->GetValueBarPos();
508 if(_ImageCanvasFloat->GetImageCanvas() != NULL){
509 if(_ImageCanvasFloat->GetImageCanvas()->HistogrammIsShown())
510 histo_was_shown_for_float =
true;
511 if(_ImageCanvasFloat->GetImageCanvas()->ImageValueBarIsShown())
512 valuebar_was_shown_for_float =
true;
516 _MainSizer->Detach(_ImageCanvasFloat);
517 _ImageCanvasFloat->Destroy();
518 _ImageCanvasFloat = NULL;
522 if (_ImageCanvasUC == NULL)
524 _ImageCanvasUC =
new ImageCanvas(_SizerWindow, GetStatusBar(), 2, -1, wxPoint(1,1));
526 _ImageCanvasUC->SetClearDrawingContext(
true);
528 _MainSizer->Add(_ImageCanvasUC,wxEXPAND);
531 _HistoPosition = _ImageCanvasUC->GetHistoPos();
532 _HistoSize = _ImageCanvasUC->GetHistoSize();
533 _ValueBarSize = _ImageCanvasUC->GetValueBarSize();
534 _ValueBarPosition = _ImageCanvasUC->GetValueBarPos();
541 if(!histo_was_shown_for_float){
543 if(_ImageCanvasUC->HistogrammIsShown())
544 ShowHistogramm(image);
546 _ShowHistogramm =
false;
549 ShowHistogramm(image);
553 if(_ShowImageValueBar){
554 if(!valuebar_was_shown_for_float){
556 if(_ImageCanvasUC->ImageValueBarIsShown())
557 ShowImageValueBar(image);
559 _ShowImageValueBar =
false;
562 ShowImageValueBar(image);
572 if ( _SelectedChannel>4 && _SelectedChannel<8) {
575 if (ImageConvert::ToHSV(ucImage, hsl)!=0) {
576 BIASERR(
"Picture conversion to HSL failed.");
579 ImageConvert::GetChannel(ucImage, _SelectedChannel-5);
583 BIASERR(
"Can't show selected Channel, because picture has less channels.");
589 if (_SelectedChannel > 0)
591 ImageConvert::GetChannel(ucImage, _SelectedChannel-1);
595 if (_FitCheckBox->IsChecked()) {
598 GetClientSize(&width, &height);
601 float xscale = (float)width / image.
GetWidth();
602 float yscale = (float)height / image.
GetHeight();
603 float scale = xscale < yscale ? xscale : yscale;
605 _ImageCanvasUC->SetScaledImageSize((
int)(image.
GetWidth() * scale), (
int)(image.
GetHeight() * scale));
606 _ImageCanvasUC->SetShowScaled(
true);
609 _ImageCanvasUC->SetShowScaled(
false);
614 _ImageCanvasUC->Show(ucImage, fileName);
617 if (_FitCheckBox->IsChecked()){
618 _ImageCanvasUC->SetScrollbars(0, 0, 0, 0);
624 bool histo_was_shown_for_uc =
false;
625 bool valuebar_was_shown_for_uc =
false;
628 if (_ImageCanvasUC != NULL)
632 _HistoPosition = _ImageCanvasUC->GetHistoPos();
633 _HistoSize = _ImageCanvasUC->GetHistoSize();
635 _ValueBarSize = _ImageCanvasUC->GetValueBarSize();
636 _ValueBarPosition = _ImageCanvasUC->GetValueBarPos();
641 if(_ImageCanvasUC->HistogrammIsShown())
642 histo_was_shown_for_uc =
true;
643 if(_ImageCanvasUC->ImageValueBarIsShown())
644 valuebar_was_shown_for_uc =
true;
646 _MainSizer->Detach(_ImageCanvasUC);
647 _ImageCanvasUC->Destroy();
648 _ImageCanvasUC = NULL;
652 if (_ImageCanvasFloat == NULL)
654 _ImageCanvasFloat =
new ScaledImageCanvas(_SizerWindow, GetStatusBar(), 2, -1, wxPoint(1,1));
655 _MainSizer->Add(_ImageCanvasFloat,wxEXPAND);
658 _HistoPosition = _ImageCanvasFloat->GetImageCanvas()->GetHistoPos();
659 _HistoSize = _ImageCanvasFloat->GetImageCanvas()->GetHistoSize();
660 _ValueBarSize = _ImageCanvasFloat->GetImageCanvas()->GetValueBarSize();
661 _ValueBarPosition = _ImageCanvasFloat->GetImageCanvas()->GetValueBarPos();
668 if(!histo_was_shown_for_uc){
670 if(_ImageCanvasFloat->GetImageCanvas() != NULL){
672 if(_ImageCanvasFloat->GetImageCanvas()->HistogrammIsShown())
673 ShowHistogramm(image);
675 _ShowHistogramm =
false;
679 if(_ImageCanvasFloat->GetImageCanvas() != NULL){
680 ShowHistogramm(image);
685 if(_ShowImageValueBar){
686 if(!valuebar_was_shown_for_uc){
688 if(_ImageCanvasFloat->GetImageCanvas() != NULL){
690 if(_ImageCanvasFloat->GetImageCanvas()->ImageValueBarIsShown())
691 ShowImageValueBar(image);
693 _ShowImageValueBar =
false;
697 if(_ImageCanvasFloat->GetImageCanvas() != NULL){
698 ShowImageValueBar(image);
729 BIASERR(
"Can't show selected Channel, because picture has less channels.")
734 if (_SelectedChannel > 0)
736 ImageConvert::GetChannel(image, _SelectedChannel-1);
740 if (_FitCheckBox->IsChecked())
744 GetClientSize(&width, &height);
745 width = max(1, width - 10);
746 height = max(1, height - 40);
749 float xscale = (float)width / image.
GetWidth();
750 float yscale = (float)height / image.
GetHeight();
751 float scale = xscale < yscale ? xscale : yscale;
753 _ImageCanvasFloat->GetImageCanvas()->SetScaledImageSize((
int)(image.
GetWidth() * scale), (
int)(image.
GetHeight() * scale));
754 _ImageCanvasFloat->GetImageCanvas()->SetShowScaled(
true);
758 _ImageCanvasFloat->GetImageCanvas()->SetShowScaled(
false);
763 _ImageCanvasFloat->Show(image, fileName);
766 if (_FitCheckBox->IsChecked())
768 _ImageCanvasFloat->GetImageCanvas()->SetScrollbars(0, 0, 0, 0);
773 msg <<
"File '" << fileName <<
"' (" << image.
GetWidth() <<
"x" << image.
GetHeight() <<
") loaded";
776 this->RefitClients();
788 void BVWXMainFrame::LoadImages(
const wxArrayString &paths)
792 unsigned old_size = _FileNames.size();
793 for (
int i = 0; i < (int)paths.GetCount(); i++) {
794 wxString extUP=wxFileName(paths[i]).GetExt().Upper();
795 if (wxFileName(paths[i]).IsDir()) {
801 vector<string> lstFilenames;
805 BIASERR(
"could not load image list file "<<WxToAscii(paths[i])
806 <<
" result="<<result<<endl);
809 _FileNames.insert(_FileNames.end(), lstFilenames.begin(),
810 lstFilenames.end() );
813 _FileNames.push_back(
string(WxToAscii(paths[i])) );
818 if (!_FileNames.empty()) {
820 for (std::vector<std::string>::iterator it = _FileNames.begin();
821 it != _FileNames.end(); it++) {
823 StringUtils::Trim(*it, str);
825 *it = FileHandling::CorrectSlashes(str);
833 if (!_FileNames.empty()) {
834 LoadImageFromList(old_size);
835 _DefaultFile =
AsciiToWx(_FileNames[old_size]);
839 wxMessageBox(wxT(
"Dropping directories is unsupported. Please drop only filenames!"),
840 wxT(
"Drag&Drop Error"), wxOK | wxICON_EXCLAMATION);
844 void BVWXMainFrame::FitSizetIfTooSmall()
849 if (_ImageCanvasUC!=NULL){
850 if (_ImageCanvasUC->GetOrigImage()==NULL)
852 imgW = _ImageCanvasUC->GetOrigImage()->GetWidth();
853 imgH = _ImageCanvasUC->GetOrigImage()->GetHeight();
854 }
else if (_ImageCanvasFloat!=NULL){
855 imgW = _ImageCanvasFloat->GetOrigimg().GetWidth();
856 imgH = _ImageCanvasFloat->GetOrigimg().GetHeight();
862 this->GetClientSize(&w, &h);
865 int screenW=0, screenH=0;
866 ::wxDisplaySize(&screenW, &screenH);
867 if ( (w<imgW) || (h<imgH)) {
875 min(imgW+40, screenW), min(imgH+100, screenH) );
877 this->RefitClients();
881 void BVWXMainFrame::RefitClients()
885 GetClientSize(&w, &h);
887 if(_ImageCanvasUC != NULL || _ImageCanvasFloat != NULL){
888 _SizerWindow->SetSize(w,h);
890 if (_ImageCanvasUC!=NULL){
891 _ImageCanvasUC->SetSize(
896 if (_ImageCanvasFloat!=NULL){
897 _ImageCanvasFloat->SetSize(
904 void BVWXMainFrame::OnLoad(wxCommandEvent& WXUNUSED(event))
906 wxFileDialog fileDialog(
908 wxT(
"Choose file(s) to load"),
911 wxT(
"Image files (mip;pgm;ppm;jpg;jpeg;png)|*.mip;*.pgm;*.ppm;*.jpg;*.jpeg;*.png|All files (*.*)|*.*"),
912 wxFD_OPEN | wxFD_MULTIPLE);
914 if (fileDialog.ShowModal() == wxID_OK)
918 fileDialog.GetPaths(paths);
922 SetStatusText(wxT(
"Loading canceled"),0);
925 _DefaultDir = fileDialog.GetDirectory();
930 info <<
"Width: " << image.
GetWidth() << endl;
931 info <<
"Height: " << image.
GetHeight() << endl;
932 info <<
"Depth: " << image.
GetDepth() << endl;
933 info <<
"BitDepth: " << image.
GetBitDepth() << endl;
934 info <<
"SizeByte: " << image.
GetSizeByte() <<
" bytes" << endl;
939 info <<
"IsPlanar: " << image.
IsPlanar() << endl;
941 info <<
"UUID: " << image.
GetUID() << endl;
945 void BVWXMainFrame::OnInfo(wxCommandEvent& WXUNUSED(event))
949 if (_ImageCanvasUC != NULL)
951 image = _ImageCanvasUC->GetOrigImage();
953 else if (_ImageCanvasFloat != NULL)
955 image = &_ImageCanvasFloat->GetOrigimg();
959 wxMessageBox(wxT(
"No image loaded"), wxT(
"Image Info"), wxOK | wxICON_ERROR,
this);
965 BIASASSERT(image!=NULL);
966 AddInfo(*image, info);
969 if (infoRaw_.size()>0)
970 info << endl<<endl<<
"RAW info before uncompression: "<<endl<<infoRaw_<<endl;
973 wxMessageBox(
AsciiToWx(info.str()), wxT(
"Image Info"), wxOK,
this);
976 void BVWXMainFrame::OnDrawROI(wxCommandEvent& WXUNUSED(event))
978 if (_ImageCanvasUC != NULL) {
979 _ImageCanvasUC->DrawRoi(_DrawROICheckItem->IsChecked());
981 else if(_ImageCanvasFloat != NULL){
982 _ImageCanvasFloat->GetImageCanvas()->DrawRoi(_DrawROICheckItem->IsChecked());
986 void BVWXMainFrame::OnImageValues(wxCommandEvent& WXUNUSED(event))
988 float dmin=0.0, dmax=0.0;
991 if (_ImageCanvasUC != NULL) {
992 image = _ImageCanvasUC->GetOrigImage();
994 unsigned char min, max;
998 }
else if (_ImageCanvasFloat != NULL){
999 image = &_ImageCanvasFloat->GetOrigimg();
1004 wxMessageBox(wxT(
"No image loaded"), wxT(
"Image Values"),
1005 wxOK | wxICON_ERROR,
this);
1011 info <<
"min pixel value: " << dmin << endl;
1012 info <<
"max pixel value: " << dmax << endl;
1015 wxMessageBox(
AsciiToWx(info.str()), wxT(
"Image Values"), wxOK,
this);
1018 void BVWXMainFrame::OnMetaData(wxCommandEvent& WXUNUSED(event))
1020 wxFont font(10, wxMODERN, wxNORMAL, wxNORMAL,
false, wxT(
"Courier"));
1021 wxDialog* dlg =
new wxDialog(
this, -1, wxT(
"Meta Data"), wxDefaultPosition, wxDefaultSize,
1022 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
1023 wxTextCtrl* text =
new wxTextCtrl(dlg, -1, wxT(
""),
1024 wxDefaultPosition, wxSize(650, 400),
1025 wxTE_MULTILINE | wxTE_READONLY | wxTE_DONTWRAP);
1027 text->SetFont(font);
1029 text->SetDefaultStyle(wxTextAttr(wxNullColour, wxNullColour, font));
1031 text->SetInsertionPoint(0);
1037 void BVWXMainFrame::OnExit(wxCommandEvent& WXUNUSED(event))
1042 void BVWXMainFrame::OnKeyInfo(wxCommandEvent& WXUNUSED(event))
1045 wxT(
"Next Image\tCtrl+[Right]\n")
1046 wxT(
"Prev Image\tCtrl+[Left]\n")
1047 wxT(
"Run-Stop\tCtrl+[Space]");
1049 wxMessageBox(text, wxT(
"Keys"),
1050 wxOK | wxICON_INFORMATION,
this);
1054 void BVWXMainFrame::
1055 OnAbout(wxCommandEvent &event)
1059 desc << wxT(
"The BiasViewWX Image Viewer, part of the\n");
1060 desc << wxT(
"BIAS library (Basic ImageAlgorithmS)\n\n");
1063 text <<
"Built on " << __DATE__ <<
" " << __TIME__ <<
"\n"
1065 <<
"GUI using: " << WxToAscii(wxVERSION_STRING)<<
"\n";
1066 text<<
"Built with support for:\n";
1067 #ifdef BIAS_HAVE_LIBJPEG
1068 text<<
"- jpeg (libJPEG).\n";
1070 #ifdef BIAS_HAVE_OPENCV
1071 text<<
"- OpenCV.\n";
1073 #ifdef BIAS_HAVE_IMAGEMAGICKLIB
1074 text<<
"- ImageMagick.\n";
1076 #ifdef BIAS_HAVE_OPENEXR
1077 text<<
"- OpenEXR.\n";
1081 wxString lic = wxT(
"BIAS is free software; you can redistribute it and/or modify\n \
1082 it under the terms of the GNU Lesser General Public Licence as published by\n \
1083 the Free Software Foundation; either version 2.1 of the Licence, or\n \
1084 (at your option) any later version.\n \
1086 BIAS is distributed in the hope that it will be useful,\n \
1087 but WITHOUT ANY WARRANTY; without even the implied warranty of\n \
1088 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n \
1089 GNU Lesser General Public Licence for more details.\n \
1091 You should have received a copy of the GNU Lesser General Public Licence\n \
1092 along with BIAS; if not, write to the Free Software\n \
1093 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n");
1095 wxAboutDialogInfo aboutdlg;
1096 aboutdlg.SetDescription( desc );
1097 aboutdlg.SetLicence( lic );
1098 aboutdlg.SetCopyright( wxT(
"Copyright (C) 2003-2011\n Multimediale Systeme der Informationsverarbeitung\n Institut fuer Informatik\n Christian-Albrechts-Universitaet Kiel") );
1099 aboutdlg.SetWebSite( wxT(
"http://www.mip.informatik.uni-kiel.de/") );
1101 wxAboutBox( aboutdlg );
1105 void BVWXMainFrame::OnRemoveCurrent(wxCommandEvent& WXUNUSED(event)){
1109 if (_CurrentImage < (
int)_FileNames.size()){
1110 _FileNames.erase(_FileNames.begin()+_CurrentImage);
1112 if(_CurrentImage > (
int)_FileNames.size()-1){
1116 LoadImageFromList(_CurrentImage);
1119 void BVWXMainFrame::OnRemoveAllButCurrent(wxCommandEvent& WXUNUSED(event)){
1124 if (_FileNames.size()<1){
1125 SetStatusText(_T(
"No images to remove."),0);
1128 BIASASSERT( (
int)_FileNames.size() > _CurrentImage);
1130 _FileNames[0] = _FileNames[_CurrentImage];
1132 _FileNames.resize(1);
1134 LoadImageFromList(_CurrentImage);
1141 void BVWXMainFrame::PrintSavingError(
const int errorNo, wxString fname)
1143 std::stringstream msg;
1144 msg <<
"Error saving "
1146 <<
" with result = "
1150 wxT(
"Error saving file"),
1156 void BVWXMainFrame::PrintConversionError(
const int errorNo, wxString fname)
1158 std::stringstream msg;
1159 msg <<
"Error converting "
1161 <<
" with result = "
1165 wxT(
"Conversion Error"),
1171 void BVWXMainFrame::PrintEmptyNameMsg()
1173 wxString str(wxT(
"Please, give this image a name if you want to save it"));
1174 wxMessageBox(str, wxT(
"No Filename"), wxICON_INFORMATION,
this);
1178 void BVWXMainFrame::PrintNoImageToFilter()
1180 wxString msg(wxT(
"No Image Loaded To Filter"));
1184 wxOK | wxICON_INFORMATION,
1190 return ImageConvert::ConvertST(imageTemp,
1192 ImageBase::ST_unsignedchar);
1196 void BVWXMainFrame::OnSaveAs(wxCommandEvent& event)
1198 if (!_FileNames.empty()) {
1200 std::string absoluteName = _FileNames[_CurrentImage];
1201 std::string tmpFileName = fh.
Basename(absoluteName) +
".mip";
1203 wxString message = _T(
"Save current image to");
1205 wxString defaultFileName =
AsciiToWx(tmpFileName);
1206 wxString wildcard = wxT(
"Image files (mip;pgm;ppm;jpg;jpeg;png)|*.mip;*.pgm;*.ppm;*.jpg;*.jpeg;*.png|All files (*.*)|*.*");
1208 wxFileDialog wd(
this,
1213 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
1215 if (wxID_OK == wd.ShowModal()) {
1216 wxString fname = wd.GetPath();
1218 if (!(fh.
Basename(WxToAscii(fname))).empty()) {
1221 if (_ImageCanvasUC) {
1222 if (ImageIO::FF_exr != ImageIO::GetFileFormat(WxToAscii(fname))) {
1223 ImageBase* imUC = _ImageCanvasUC->GetOrigImage();
1224 notOK = ImageIO::Save(WxToAscii(fname), *imUC);
1225 if (notOK!=0) PrintSavingError(notOK, fname);
1226 else SetStatusText(wxT(
"Saving to disk succeeded"));
1228 wxString msg = wxT(
"We don't support conversion from lesser to higher storagetype");
1229 wxMessageBox(msg, wxT(
"Unsupported Conversion"), wxICON_INFORMATION);
1231 BIASERR(WxToAscii(msg));
1234 else if(_ImageCanvasFloat)
1236 ImageBase imFL = _ImageCanvasFloat->GetShownImage();
1239 if (ImageIO::FF_exr == tf) {
1240 notOK = ImageIO::Save(WxToAscii(fname), imFL);
1241 if (notOK!=0) PrintSavingError(notOK, fname);
1242 else SetStatusText(wxT(
"Saving to disk succeeded"));
1244 else if (ImageIO::FF_mip == tf)
1246 wxMessageDialog dl(
this,
1247 wxT(
"Convert to UNSIGNED CHAR?"),
1248 wxT(
"Conversion Question"),
1249 wxNO_DEFAULT|wxYES_NO|wxCANCEL);
1251 switch(dl.ShowModal()) {
1253 notOK = BVWXMainFrame::ConvertFLtoUC(imFL);
1254 if (notOK!=0) PrintConversionError(notOK, fname);
1257 notOK = ImageIO::Save(WxToAscii(fname), imFL);
1258 if (notOK!=0) PrintSavingError(notOK, fname);
1259 else SetStatusText(wxT(
"Saving to disk succeeded"));
1264 SetStatusText(wxT(
"Unexpected wxMessageDialog return code"));
1270 ucImg = _ImageCanvasFloat->GetImageCanvas()->GetImageShown();
1271 notOK = ImageIO::Save(WxToAscii(fname), *ucImg);
1272 if (notOK) PrintSavingError(notOK, fname);
1273 else SetStatusText(wxT(
"Saving to disk succeeded"));
1277 BIASERR(
"No image canvas!");
1278 SetStatusText(wxT(
"No image canvas!"));
1281 PrintEmptyNameMsg();
1285 SetStatusText(wxT(
"Nothing to Save"));
1289 void BVWXMainFrame::OnPrintCurrent(wxCommandEvent& event)
1291 wxPrintDialogData dlgData;
1294 dlgData.SetPrintData(data);
1296 wxPrintDialog pDialog(
this,&dlgData);
1297 int ret = pDialog.ShowModal();
1301 else if(ret==wxID_CANCEL)
1306 void BVWXMainFrame::OnPrint(wxCommandEvent& event)
1308 wxPrintDialogData dlgData;
1311 wxPrintDialog pDialog(
this,&dlgData);
1312 int ret = pDialog.ShowModal();
1316 else if(ret==wxID_CANCEL)
1320 void BVWXMainFrame::OnSaveCurrent(wxCommandEvent& event)
1322 if (!_FileNames.empty()) {
1324 std::string absoluteName = _FileNames[_CurrentImage];
1325 std::string tmpFileName = fh.
Basename(absoluteName) +
".mip";
1327 wxString message = _T(
"Save image as currently displayed with storage type unsigned char to:");
1329 wxString defaultFileName =
AsciiToWx(tmpFileName);
1330 wxString wildcard = wxT(
"Image files (mip;pgm;ppm;jpg;jpeg;png)|*.mip;*.pgm;*.ppm;*.jpg;*.jpeg;*.png|All files (*.*)|*.*");
1332 wxFileDialog wd(
this,
1337 wxFD_SAVE|wxFD_OVERWRITE_PROMPT);
1339 if (wxID_OK == wd.ShowModal()) {
1340 wxString fname = wd.GetPath();
1342 if (!(fh.
Basename(WxToAscii(fname))).empty()) {
1347 if (_ImageCanvasUC) {
1348 img = _ImageCanvasUC->GetOrigImage();
1349 notOK = ImageIO::Save(WxToAscii(fname), *img);
1351 img = &_ImageCanvasFloat->GetShownImage();
1357 ImageConvert::ConvertST(*img,tmpUC,ImageBase::ST_unsignedchar);
1358 notOK = ImageIO::Save(WxToAscii(fname), tmpUC);
1361 notOK = ImageIO::Save(WxToAscii(fname), *img);
1365 PrintSavingError(notOK, fname);
1367 SetStatusText(wxT(
"Saving to disk succeeded"));
1371 PrintEmptyNameMsg();
1376 SetStatusText(wxT(
"Nothing to Save"));
1381 void BVWXMainFrame::OnSaveAsMovie(wxCommandEvent& WXUNUSED(event)){
1382 #ifdef BIAS_HAVE_FFMPEG
1384 std::string absoluteName = _FileNames[_CurrentImage];
1385 std::string tmpFileName = fh.
Basename(absoluteName) +
".mpeg";
1387 wxString message = _T(
"Save movie of images to:");
1389 wxString defaultFileName =
AsciiToWx(tmpFileName);
1390 wxString wildcard = wxT(
"Movie files (avi;mpeg;divx;xvid)|*.avi;*.mpeg;*.divx;*.xvid;|All files (*.*)|*.*");
1407 ImageIO::Load(_FileNames[_CurrentImage],tmp);
1418 int ret = dialog.ShowModal();
1428 int ret = vs.
Open(WxToAscii(fname));
1431 st<<
"Opening video ouput file failed: "<<vs.
GetError();
1432 wxString msg =
AsciiToWx(st.str().c_str());
1433 wxMessageBox(msg, wxT(
"Encoding failed."),
1434 wxOK | wxICON_ERROR,
this);
1438 wxProgressDialog progressDlg(wxT(
"Encoding..."),
1439 wxT(
"Encoding movie, please wait."),
1441 wxPD_ELAPSED_TIME|wxPD_REMAINING_TIME|wxPD_AUTO_HIDE|wxPD_SMOOTH);
1444 bool reverse = _ReverseCheckBox->GetValue();
1446 for(
unsigned i=0;i<_FileNames.size();i++){
1448 if(reverse) index = _FileNames.size()-1-index;
1449 ret= vs.
AddFrame(_FileNames[index]);
1451 progressDlg.Update(((
float)i/(
float)_FileNames.size()) * 100.0);
1456 st<<
"Encoding failed: "<<vs.
GetError();
1457 wxString msg =
AsciiToWx(st.str().c_str());
1459 wxT(
"Encoding failed."),
1460 wxOK | wxICON_ERROR,
this);
1464 progressDlg.Update(100);
1466 SetStatusText(wxT(
"Saving movie succeeded."));
1468 st<<
"Movie successfully saved to: "<<WxToAscii(fname);
1469 wxString msg =
AsciiToWx(st.str().c_str());
1471 wxT(
"Encoding successful."),
1472 wxOK | wxICON_INFORMATION,
this);
1475 wxString msg = wxT(
"No FFMPEG support found in BIAS. Activate it to save images encoded as videosS");
1477 wxT(
"No FFMPEG support found in BIAS."),
1478 wxOK | wxICON_ERROR,
this);
1483 void BVWXMainFrame::OnSaveList(wxCommandEvent& WXUNUSED(event))
1485 wxString filename = wxFileSelector(_T(
"Choose file to save the image list to.")
1487 ,_T(
"out_images.lst")
1489 ,_T(
"LST files (*.lst)|*.lst|TXT files (*.txt)|*.txt|All files (*.*)|*.*")
1490 ,wxFD_SAVE|wxFD_OVERWRITE_PROMPT
1492 if ( !filename.empty() ){
1493 ofstream f( WxToAscii(filename) );
1496 msg<<
"Could not open "<<filename.c_str()<<
" for writing";
1501 vector<string>::const_iterator it = _FileNames.begin();
1503 for ( ;it<_FileNames.end(); it++){
1508 stringstream msg; msg<<
"Wrote "<<filename.c_str()<<
" with "<<n<<
" filenames";
1513 void BVWXMainFrame::OnToolEnter ( wxCommandEvent &){
1518 void BVWXMainFrame::OnNext(wxCommandEvent& WXUNUSED(event))
1521 if (_CurrentImage >= (
int)_FileNames.size())
1525 LoadImageFromList(_CurrentImage);
1528 void BVWXMainFrame::OnPrev(wxCommandEvent& WXUNUSED(event))
1531 if (_CurrentImage < 0)
1533 _CurrentImage = _FileNames.size() - 1;
1535 LoadImageFromList(_CurrentImage);
1538 void BVWXMainFrame::OnRunStop(wxCommandEvent& WXUNUSED(event))
1540 if (_Timer.IsRunning())
1543 wxToolBar* tb = GetToolBar();
1544 tb->SetToolNormalBitmap(ID_RunStop,wxIcon(play_xpm));
1548 _Timer.Start(_DelaySpin->GetValue());
1549 wxToolBar* tb = GetToolBar();
1550 tb->SetToolNormalBitmap(ID_RunStop,wxIcon(stopplaying_xpm));
1554 void BVWXMainFrame::OnRun(wxCommandEvent& WXUNUSED(event))
1556 if (!_Timer.IsRunning())
1558 _Timer.Start(_DelaySpin->GetValue());
1562 void BVWXMainFrame::OnStop(wxCommandEvent& WXUNUSED(event))
1564 if (_Timer.IsRunning())
1570 void BVWXMainFrame::OnHistogramm(wxCommandEvent& WXUNUSED(event))
1572 if (_FileNames.size() > 0){
1573 const string& fileName = _FileNames[_CurrentImage];
1577 if (ImageIO::Load(fileName.c_str(), image)!=0){
1579 msg <<
"Error loading " << fileName;
1584 if(!_ShowHistogramm)
1585 _ShowHistogramm =
true;
1587 ShowHistogramm(image);
1590 SetStatusText(
AsciiToWx(
"No Images Loaded (No Image = No Histogramm)"));
1594 if (_FileNames.size() > 0){
1597 case ImageBase::ST_unsignedchar:
1598 if(_ImageCanvasUC != NULL){
1599 _ImageCanvasUC->ShowHistogramm(image, _HistoPosition, _HistoSize);
1602 case ImageBase::ST_float:
1603 if(_ImageCanvasFloat != NULL &&
1604 _ImageCanvasFloat->GetImageCanvas() != NULL){
1605 _ImageCanvasFloat->GetImageCanvas()->ShowHistogramm(image,
1616 cout <<
"No Images Loaded (No Image = No Histogramm)" << endl;
1620 void BVWXMainFrame::OnImageValueBar(wxCommandEvent& WXUNUSED(event))
1622 _ShowImageValueBar = !_ShowImageValueBar;
1624 if (_ShowImageValueBar && _FileNames.size() > 0){
1625 const string& fileName = _FileNames[_CurrentImage];
1629 if (ImageIO::Load(fileName.c_str(), image)!=0){
1631 msg <<
"Error loading " << fileName;
1635 UncompressImage(image);
1636 ShowImageValueBar(image);
1639 if(_ImageCanvasUC != NULL && _ImageCanvasUC != NULL)
1640 _ImageCanvasUC->HideImageValueBar();
1641 if(_ImageCanvasFloat != NULL && _ImageCanvasFloat->GetImageCanvas() != NULL)
1642 _ImageCanvasFloat->GetImageCanvas()->HideImageValueBar();
1647 if (_FileNames.size() > 0){
1650 case ImageBase::ST_unsignedchar:
1651 if(_ImageCanvasUC != NULL){
1652 _ImageCanvasUC->ShowImageValueBar(image, _ValueBarPosition, _ValueBarSize);
1655 case ImageBase::ST_float:
1656 if(_ImageCanvasFloat != NULL &&
1657 _ImageCanvasFloat->GetImageCanvas() != NULL){
1658 _ImageCanvasFloat->GetImageCanvas()->ShowImageValueBar(image,
1669 cout <<
"No Images Loaded (No Image = No Histogramm)" << endl;
1672 void BVWXMainFrame::OnDelay(wxSpinEvent& WXUNUSED(event))
1674 if (_Timer.IsRunning())
1676 _Timer.Start(_DelaySpin->GetValue());
1680 void BVWXMainFrame::OnFit(wxCommandEvent& WXUNUSED(event))
1682 LoadImageFromList(_CurrentImage);
1685 void BVWXMainFrame::OnKeepScrollPosition(wxCommandEvent& WXUNUSED(event))
1687 if (_KeepScrollPositionCheckBox != NULL)
1689 if (_KeepScrollPositionCheckBox->IsChecked())
1691 if (_ImageCanvasUC!=NULL){
1692 _ImageCanvasUC->KeepScrollPosition(
true);
1694 if (_ImageCanvasFloat!=NULL){
1695 _ImageCanvasFloat->KeepScrollPosition(
true);
1698 if (_ImageCanvasUC!=NULL){
1699 _ImageCanvasUC->KeepScrollPosition(
false);
1701 if (_ImageCanvasFloat!=NULL){
1702 _ImageCanvasFloat->KeepScrollPosition(
false);
1708 void BVWXMainFrame::OnTimer(wxTimerEvent& WXUNUSED(event))
1710 if (!_BlockAnimation)
1714 _BlockAnimation =
true;
1715 wxCommandEvent dummyEvent;
1717 if (_ReverseCheckBox->GetValue())
1724 void BVWXMainFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
1726 _BlockAnimation =
false;
1729 void BVWXMainFrame::OnSize(wxSizeEvent& event)
1731 if (_FitCheckBox != NULL)
1733 if (_FitCheckBox->IsChecked())
1735 LoadImageFromList(_CurrentImage);
1738 this->RefitClients();
1743 void BVWXMainFrame::OnChangeChannel_1(wxCommandEvent& event)
1745 _SelectedChannel = 1;
1747 msg <<_SelectedChannel<<
". channel (red?) selected.";
1749 LoadImageFromList(_CurrentImage);
1752 void BVWXMainFrame::OnChangeChannel_2(wxCommandEvent& event)
1754 _SelectedChannel = 2;
1756 msg <<_SelectedChannel<<
". channel (green?) selected.";
1758 LoadImageFromList(_CurrentImage);
1761 void BVWXMainFrame::OnChangeChannel_3(wxCommandEvent& event)
1763 _SelectedChannel = 3;
1765 msg <<_SelectedChannel<<
". channel (blue?) selected.";
1767 LoadImageFromList(_CurrentImage);
1771 void BVWXMainFrame::OnChangeChannel_4(wxCommandEvent& event)
1773 _SelectedChannel = 4;
1775 msg <<_SelectedChannel<<
". channel selected.";
1777 LoadImageFromList(_CurrentImage);
1780 void BVWXMainFrame::OnChangeChannel_5(wxCommandEvent& event)
1782 _SelectedChannel = 5;
1784 msg <<_SelectedChannel<<
". channel selected.";
1786 LoadImageFromList(_CurrentImage);
1789 void BVWXMainFrame::OnChangeChannel_6(wxCommandEvent& event)
1791 _SelectedChannel = 6;
1793 msg <<_SelectedChannel<<
". channel selected.";
1795 LoadImageFromList(_CurrentImage);
1798 void BVWXMainFrame::OnChangeChannel_7(wxCommandEvent& event)
1800 _SelectedChannel = 7;
1802 msg <<_SelectedChannel<<
". channel selected.";
1804 LoadImageFromList(_CurrentImage);
1807 void BVWXMainFrame::OnChangeChannel_8(wxCommandEvent& event)
1809 _SelectedChannel = 8;
1810 cout<<_SelectedChannel<<
". channel selected."<<endl;
1811 LoadImageFromList(_CurrentImage);
1815 void BVWXMainFrame::OnChangeChannel_ALL(wxCommandEvent& event)
1818 msg <<
"All channel selected.";
1820 _SelectedChannel = 0;
1821 LoadImageFromList(_CurrentImage);
1824 void BVWXMainFrame::OnFilterCannyEdge(wxCommandEvent& WXUNUSED(event))
1826 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1828 PrintNoImageToFilter();
1830 }
else if (_ImageCanvasUC) {
1835 cannyEdge->Show(
true);
1842 cannyEdge->Show(
true);
1847 void BVWXMainFrame::OnFilterGauss(wxCommandEvent& WXUNUSED(event))
1849 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1851 PrintNoImageToFilter();
1853 }
else if (_ImageCanvasUC) {
1858 if (wxYES == wxMessageBox(wxT(
"Float Storagetype as output?"),
1859 wxT(
"Storagetype Question"),
1860 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION,
1882 void BVWXMainFrame::OnFilterGradientSobel3x3(wxCommandEvent& WXUNUSED(event))
1884 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1886 PrintNoImageToFilter();
1888 }
else if (_ImageCanvasUC) {
1893 sobel3x3->Show(
true);
1900 sobel3x3->Show(
true);
1906 void BVWXMainFrame::OnFilterMean(wxCommandEvent& WXUNUSED(event))
1908 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1910 PrintNoImageToFilter();
1912 }
else if (_ImageCanvasUC) {
1917 if (wxYES == wxMessageBox(wxT(
"Float Storagetype as output?"),
1918 wxT(
"Storagetype Question"),
1919 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION,
1943 void BVWXMainFrame::OnFilterMedian(wxCommandEvent& WXUNUSED(event))
1945 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1947 PrintNoImageToFilter();
1949 }
else if (_ImageCanvasUC) {
1954 if (wxYES == wxMessageBox(wxT(
"Float Storagetype as output?"),
1955 wxT(
"Storagetype Question"),
1956 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION,
1980 void BVWXMainFrame::OnFilterRescale(wxCommandEvent& WXUNUSED(event))
1982 if ((NULL == _ImageCanvasUC) && (NULL == _ImageCanvasFloat)) {
1984 PrintNoImageToFilter();
1986 }
else if (_ImageCanvasUC) {
1991 if (wxYES == wxMessageBox(wxT(
"Float Storagetype as output?"),
1992 wxT(
"Storagetype Question"),
1993 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION,
1998 sobel3x3->Show(
true);
2002 sobel3x3->Show(
true);
2010 sobel3x3->Show(
true);
2019 void BVWXMainFrame::OnFilterSave( wxCommandEvent &event ) {
2020 wxArrayString str = wxArrayString();
2021 str.Add(event.GetString());
void SetOutputFilename(wxString value)
void SetEncoder(enum CodecID codecId)
Set encoder.
void SetSize(int width, int height)
Set frame size of video.
unsigned int GetDepth() const
returns the bytes per channel, which is the sizeof(StorageType) Should match GetSizeDepth(GetStorageT...
Implementation of a GradientSobel3x3 filter dialog.
wxString AsciiToWx(const char *thestring)
Converts a C string to a wxString.
Video encoding using FFmpeg library.
void SetFPS(float fps)
Set framerate in frames per second.
void SetMaxBFrames(int value)
bool IsInterleaved() const
void SetMaxBFrames(int maxBFrames)
Set maximal number of bidirectional frames.
int AddFrame(const ImageBase &image)
Add an Image to the stream and write it to the video output file.
void SetColorModel(EColorModel Model)
unsigned int GetSizeByte() const
returns the nr.
int GetCodecID()
Returns the codec ID as in libavcodec/avcodec.h.
display image in wx application, provides zoom and investigation functionality
void SetHeight(int value)
Implementation of a Gauss filter dialog.
wxString GetOutputFilename()
void GetMinMaxPixelValue(StorageType &min, StorageType &max, unsigned short int channel=0, unsigned int *mincoo=NULL, unsigned int *maxcoo=NULL) const
returns the minimal and maximal pixel value in channel only Finds minimum and maximum pixel value in ...
unsigned int GetWidth() const
void SetGopSize(int gopSize)
Set the gop size of the video stream.
unsigned int GetBitDepth() const
returns the bits per channel Is not necessairily 8*sizeof(StorageType), could be fewer bits...
Implementing wxVideoSettingsDialogBase.
PGR XB3 in format 7 mode 3 delivers an image that consists of 3 channels with 8bbp (overal 24bpp)...
const BIAS::UUID & GetUID() const
returns the UUID of the image
void SetGoPSize(int value)
static std::string Basename(const std::string &fullname)
Get file base name without path from given path and filename.
Implementation of a Mean filter dialog.
int StealImage(ImageBase &source)
steals the image data array from source, after releasing the actual image data and sets source image ...
unsigned int GetChannelCount() const
returns the number of Color channels, e.g.
TFileFormat
format specifier when writing an image to a file Do NOT change order or associated enum value because...
unsigned int GetHeight() const
static int ParseListFile(const std::string &ListFileName, std::vector< std::string > &LinesInFile)
Extracts lines from passed file.
static std::string Directory(const std::string &fullname)
Get directory from given path and filename.
Implementation of a CannyEdge filter dialog.
void SetBitrate(int bitrate)
Set bitrate in bits per second.
void SetUID(const BIAS::UUID &id)
int Open(std::string filename)
Open a file for video output and init the codec.
enum EColorModel GetColorModel() const
int GetVersionNumber() const
void PrintAppData(std::ostream &os)
see whats in the camera, for debug
Functions to create, check and delete files and to handle file names, such as splitting into director...
enum EStorageType GetStorageType() const
display float images in wx application, provides zoom, scale, shift and investigation functionality ...
std::string GetError()
Get the last error message.
unsigned long int GetPixelCount() const
returns number of pixels in image
This is the base class for images in BIAS.
int ParseMetaData(bool bUse2x64bitTS=true)
After ImageIO::Load() operated on AppData_, this method fills P_, Timestamp, DC_*, ...
void SetBitrate(int value)
Implementation of a Rescale filter dialog.