X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d8bdf2dbc7c82e878038689db77e18556bad06c..761df41e86ceeed56d32c038a6c9f88554d4f47a:/samples/image/image.cpp diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 625b8dc375..c03daca077 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -22,6 +22,7 @@ #include "wx/file.h" #include "wx/mstream.h" #include "wx/wfstream.h" +#include "wx/quantize.h" #include "smile.xbm" #include "smile.xpm" @@ -51,7 +52,7 @@ public: wxBitmap *my_horse_pnm; wxBitmap *my_horse_tiff; wxBitmap *my_horse_xpm; - + wxBitmap *my_smile_xbm; wxBitmap *my_square; wxBitmap *my_anti; @@ -65,8 +66,35 @@ private: DECLARE_EVENT_TABLE() }; + +const int nChoices = 8 ; +static const wxString bppchoices[nChoices] = +{ + "1 bpp color", + "1 bpp B&W", + "4 bpp color", + "8 bpp color", + "8 bpp greyscale", + "8 bpp red", + "8 bpp own palette", + "24 bpp" +}; + +static const int bppvalues[nChoices] = +{ + wxBMP_1BPP, + wxBMP_1BPP_BW, + wxBMP_4BPP, + wxBMP_8BPP, + wxBMP_8BPP_GREY, + wxBMP_8BPP_RED, + wxBMP_8BPP_PALETTE, + wxBMP_24BPP +}; + // MyFrame + class MyFrame: public wxFrame { public: @@ -87,10 +115,10 @@ class MyImageFrame : public wxFrame { public: MyImageFrame(wxFrame *parent, const wxBitmap& bitmap) - : wxFrame(parent, -1, _T("Frame with image"), + : wxFrame(parent, -1, _T("Double click to save"), wxDefaultPosition, wxDefaultSize, wxCAPTION | wxSYSTEM_MENU), - m_bitmap(bitmap) + m_bitmap(bitmap) { SetClientSize(bitmap.GetWidth(), bitmap.GetHeight()); } @@ -101,6 +129,73 @@ public: dc.DrawBitmap( m_bitmap, 0, 0 ); } + void OnSave(wxCommandEvent& WXUNUSED(event)) + { + wxImage image(m_bitmap); + + int bppselection = wxGetSingleChoiceIndex("Set BMP BPP", + "Set BMP BPP", + nChoices, + bppchoices, + this); + if ( bppselection == -1 ) + { + // cancelled + return; + } + + image.SetOption(wxBMP_FORMAT, bppvalues[bppselection]); + + wxString deffilename = bppchoices[bppselection]; + deffilename.Replace(wxT(" "), wxT("_")); + deffilename += wxT(".bmp"); + wxString savefilename = wxFileSelector( wxT("Save Image"), + wxT(""), + deffilename, + (const wxChar *)NULL, + wxT("BMP files (*.bmp)|*.bmp|") + wxT("PNG files (*.png)|*.png|") + wxT("JPEG files (*.jpg)|*.jpg|") + wxT("GIF files (*.gif)|*.gif|") + wxT("TIFF files (*.tif)|*.tif|") + wxT("PCX files (*.pcx)|*.pcx"), + wxSAVE); + + if ( savefilename.empty() ) + return; + + if ( image.GetOptionInt(wxBMP_FORMAT) == wxBMP_8BPP_PALETTE ) + { + unsigned char *cmap = new unsigned char [256]; + for ( int i = 0; i < 256; i++ ) + cmap[i] = i; + image.SetPalette(wxPalette(256, cmap, cmap, cmap)); + + delete cmap; + } + + bool saved = FALSE; + + wxString extension = savefilename.AfterLast('.').Lower(); + + if (extension == "bmp") + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_BMP); + else if (extension == "png") + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_PNG); + else if (extension == "pcx") + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_PCX); + else if ((extension == "tif") || (extension == "tiff")) + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_TIF); + else if (extension == "jpg") + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_JPEG); + else if (extension == "pnm") + saved=image.SaveFile(savefilename, wxBITMAP_TYPE_PNM); + else + wxMessageBox("Unknown file type, see options in file selector.", + "Unknown file type", + wxOK|wxCENTRE, this); + } + private: wxBitmap m_bitmap; @@ -124,7 +219,8 @@ IMPLEMENT_APP(MyApp) IMPLEMENT_DYNAMIC_CLASS(MyCanvas, wxScrolledWindow) BEGIN_EVENT_TABLE(MyImageFrame, wxFrame) - EVT_PAINT(MyImageFrame::OnPaint) + EVT_PAINT(MyImageFrame::OnPaint) + EVT_LEFT_DCLICK(MyImageFrame::OnSave) END_EVENT_TABLE() BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) @@ -157,7 +253,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, wxMemoryDC dc; dc.SelectObject( bitmap ); - dc.SetBrush( wxBrush( "orange", wxSOLID ) ); + dc.SetBrush( wxBrush( wxT("orange"), wxSOLID ) ); dc.SetPen( *wxBLACK_PEN ); dc.DrawRectangle( 0, 0, 100, 100 ); dc.SetBrush( *wxWHITE_BRUSH ); @@ -166,18 +262,18 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, // try to find the directory with our images wxString dir; - if ( wxFile::Exists("./horse.png") ) + if ( wxFile::Exists(wxT("./horse.png")) ) dir = "./"; - else if ( wxFile::Exists("../horse.png") ) + else if ( wxFile::Exists(wxT("../horse.png")) ) dir = "../"; else - wxLogWarning("Can't find image files in either '.' or '..'!"); + wxLogWarning(wxT("Can't find image files in either '.' or '..'!")); wxImage image = bitmap.ConvertToImage(); #if wxUSE_LIBPNG if ( !image.SaveFile( dir + wxString("test.png"), wxBITMAP_TYPE_PNG )) - wxLogError("Can't save file"); + wxLogError(wxT("Can't save file")); image.Destroy(); @@ -187,7 +283,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.png")) ) - wxLogError("Can't load PNG image"); + wxLogError(wxT("Can't load PNG image")); else my_horse_png = new wxBitmap( image ); #endif // wxUSE_LIBPNG @@ -196,7 +292,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.jpg")) ) - wxLogError("Can't load JPG image"); + wxLogError(wxT("Can't load JPG image")); else my_horse_jpeg = new wxBitmap( image ); #endif // wxUSE_LIBJPEG @@ -205,7 +301,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.gif")) ) - wxLogError("Can't load GIF image"); + wxLogError(wxT("Can't load GIF image")); else my_horse_gif = new wxBitmap( image ); #endif @@ -214,7 +310,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.pcx"), wxBITMAP_TYPE_PCX ) ) - wxLogError("Can't load PCX image"); + wxLogError(wxT("Can't load PCX image")); else my_horse_pcx = new wxBitmap( image ); #endif @@ -222,7 +318,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.bmp"), wxBITMAP_TYPE_BMP ) ) - wxLogError("Can't load BMP image"); + wxLogError(wxT("Can't load BMP image")); else my_horse_bmp = new wxBitmap( image ); @@ -230,19 +326,19 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.xpm"), wxBITMAP_TYPE_XPM ) ) - wxLogError("Can't load XPM image"); + wxLogError(wxT("Can't load XPM image")); else my_horse_xpm = new wxBitmap( image ); if ( !image.SaveFile( dir + wxString("test.xpm"), wxBITMAP_TYPE_XPM )) - wxLogError("Can't save file"); + wxLogError(wxT("Can't save file")); #endif #if wxUSE_PNM image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.pnm"), wxBITMAP_TYPE_PNM ) ) - wxLogError("Can't load PNM image"); + wxLogError(wxT("Can't load PNM image")); else my_horse_pnm = new wxBitmap( image ); #endif @@ -251,7 +347,7 @@ MyCanvas::MyCanvas( wxWindow *parent, wxWindowID id, image.Destroy(); if ( !image.LoadFile( dir + wxString("horse.tif"), wxBITMAP_TYPE_TIF ) ) - wxLogError("Can't load TIFF image"); + wxLogError(wxT("Can't load TIFF image")); else my_horse_tiff = new wxBitmap( image ); #endif @@ -292,7 +388,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) if (my_square && my_square->Ok()) dc.DrawBitmap( *my_square, 30, 30 ); dc.DrawText( "Drawn directly", 150, 10 ); - dc.SetBrush( wxBrush( "orange", wxSOLID ) ); + dc.SetBrush( wxBrush( wxT("orange"), wxSOLID ) ); dc.SetPen( *wxBLACK_PEN ); dc.DrawRectangle( 150, 30, 100, 100 ); dc.SetBrush( *wxWHITE_BRUSH ); @@ -343,14 +439,14 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) { dc.DrawText( "XBM bitmap", 30, 1975 ); dc.DrawText( "(green on red)", 30, 1990 ); - dc.SetTextForeground( "GREEN" ); - dc.SetTextBackground( "RED" ); + dc.SetTextForeground( wxT("GREEN") ); + dc.SetTextBackground( wxT("RED") ); dc.DrawBitmap( *my_smile_xbm, 30, 2010 ); - dc.SetTextForeground( "BLACK" ); + dc.SetTextForeground( wxT("BLACK") ); dc.DrawText( "After wxImage conversion", 150, 1975 ); dc.DrawText( "(red on white)", 150, 1990 ); - dc.SetTextForeground( "RED" ); + dc.SetTextForeground( wxT("RED") ); wxImage i = my_smile_xbm->ConvertToImage(); i.SetMaskColour( 255, 255, 255 ); i.Replace( 0, 0, 0, @@ -358,7 +454,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); dc.DrawBitmap( i.ConvertToBitmap(), 150, 2010, TRUE ); - dc.SetTextForeground( "BLACK" ); + dc.SetTextForeground( wxT("BLACK") ); } @@ -380,14 +476,14 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) { dc.DrawText( "Mono bitmap", 30, 2095 ); dc.DrawText( "(red on green)", 30, 2110 ); - dc.SetTextForeground( "RED" ); - dc.SetTextBackground( "GREEN" ); + dc.SetTextForeground( wxT("RED") ); + dc.SetTextBackground( wxT("GREEN") ); dc.DrawBitmap( mono, 30, 2130 ); - dc.SetTextForeground( "BLACK" ); + dc.SetTextForeground( wxT("BLACK") ); dc.DrawText( "After wxImage conversion", 150, 2095 ); dc.DrawText( "(red on white)", 150, 2110 ); - dc.SetTextForeground( "RED" ); + dc.SetTextForeground( wxT("RED") ); wxImage i = mono.ConvertToImage(); i.SetMaskColour( 255,255,255 ); i.Replace( 0,0,0, @@ -395,7 +491,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxRED_PEN->GetColour().Green(), wxRED_PEN->GetColour().Blue() ); dc.DrawBitmap( i.ConvertToBitmap(), 150, 2130, TRUE ); - dc.SetTextForeground( "BLACK" ); + dc.SetTextForeground( wxT("BLACK") ); } dc.DrawText("XPM bitmap", 30, 2230); @@ -422,7 +518,7 @@ void MyCanvas::CreateAntiAliasedBitmap() dc.Clear(); dc.SetFont( wxFont( 24, wxDECORATIVE, wxNORMAL, wxNORMAL) ); - dc.SetTextForeground( "RED" ); + dc.SetTextForeground( wxT("RED") ); dc.DrawText( "This is anti-aliased Text.", 20, 20 ); dc.DrawText( "And a Rectangle.", 20, 60 );