| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: samples/image/image.cpp
- // Purpose: sample showing operations with wxImage
- // Author: Robert Roebling
- // Modified by: Francesco Montorsi
- // Created: 1998
- // Copyright: (c) 1998-2005 Robert Roebling
- // (c) 2005-2009 Vadim Zeitlin
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- // For compilers that support precompilation, includes "wx/wx.h".
- #include "wx/wxprec.h"
- #ifdef __BORLANDC__
- #pragma hdrstop
- #endif
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif
- #include "wx/image.h"
- #include "wx/file.h"
- #include "wx/filename.h"
- #include "wx/graphics.h"
- #include "wx/mstream.h"
- #include "wx/wfstream.h"
- #include "wx/quantize.h"
- #include "wx/scopedptr.h"
- #include "wx/stopwatch.h"
- #include "wx/versioninfo.h"
- #if wxUSE_CLIPBOARD
- #include "wx/dataobj.h"
- #include "wx/clipbrd.h"
- #endif // wxUSE_CLIPBOARD
- #if defined(__WXMSW__)
- #ifdef wxHAVE_RAW_BITMAP
- #include "wx/rawbmp.h"
- #endif
- #endif
- #if defined(__WXMAC__) || defined(__WXGTK__)
- #define wxHAVE_RAW_BITMAP
- #include "wx/rawbmp.h"
- #endif
- #include "canvas.h"
- #ifndef wxHAS_IMAGES_IN_RESOURCES
- #include "../sample.xpm"
- #endif
- // ============================================================================
- // declarations
- // ============================================================================
- //-----------------------------------------------------------------------------
- // MyApp
- //-----------------------------------------------------------------------------
- class MyApp: public wxApp
- {
- public:
- virtual bool OnInit();
- };
- // ----------------------------------------------------------------------------
- // MyFrame
- // ----------------------------------------------------------------------------
- class MyFrame: public wxFrame
- {
- public:
- MyFrame();
- void OnAbout( wxCommandEvent &event );
- void OnNewFrame( wxCommandEvent &event );
- void OnImageInfo( wxCommandEvent &event );
- void OnThumbnail( wxCommandEvent &event );
- #ifdef wxHAVE_RAW_BITMAP
- void OnTestRawBitmap( wxCommandEvent &event );
- #endif // wxHAVE_RAW_BITMAP
- #if wxUSE_GRAPHICS_CONTEXT
- void OnTestGraphics(wxCommandEvent& event);
- #endif // wxUSE_GRAPHICS_CONTEXT
- void OnQuit( wxCommandEvent &event );
- #if wxUSE_CLIPBOARD
- void OnCopy(wxCommandEvent& event);
- void OnPaste(wxCommandEvent& event);
- #endif // wxUSE_CLIPBOARD
- MyCanvas *m_canvas;
- private:
- // ask user for the file name and try to load an image from it
- //
- // return the file path on success, empty string if we failed to load the
- // image or were cancelled by user
- static wxString LoadUserImage(wxImage& image);
- wxDECLARE_DYNAMIC_CLASS(MyFrame);
- wxDECLARE_EVENT_TABLE();
- };
- // ----------------------------------------------------------------------------
- // Frame used for showing a standalone image
- // ----------------------------------------------------------------------------
- enum
- {
- ID_ROTATE_LEFT = wxID_HIGHEST+1,
- ID_ROTATE_RIGHT,
- ID_RESIZE,
- ID_PAINT_BG
- };
- class MyImageFrame : public wxFrame
- {
- public:
- MyImageFrame(wxFrame *parent, const wxString& desc, const wxImage& image)
- {
- Create(parent, desc, wxBitmap(image), image.GetImageCount(desc));
- }
- MyImageFrame(wxFrame *parent, const wxString& desc, const wxBitmap& bitmap)
- {
- Create(parent, desc, bitmap);
- }
- private:
- bool Create(wxFrame *parent,
- const wxString& desc,
- const wxBitmap& bitmap,
- int numImages = 1)
- {
- if ( !wxFrame::Create(parent, wxID_ANY,
- wxString::Format(wxT("Image from %s"), desc),
- wxDefaultPosition, wxDefaultSize,
- wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE) )
- return false;
- m_bitmap = bitmap;
- m_zoom = 1.;
- wxMenu *menu = new wxMenu;
- menu->Append(wxID_SAVEAS);
- menu->AppendSeparator();
- menu->AppendCheckItem(ID_PAINT_BG, wxT("&Paint background"),
- "Uncheck this for transparent images");
- menu->AppendSeparator();
- menu->Append(ID_RESIZE, wxT("&Fit to window\tCtrl-F"));
- menu->Append(wxID_ZOOM_IN, "Zoom &in\tCtrl-+");
- menu->Append(wxID_ZOOM_OUT, "Zoom &out\tCtrl--");
- menu->Append(wxID_ZOOM_100, "Reset zoom to &100%\tCtrl-1");
- menu->AppendSeparator();
- menu->Append(ID_ROTATE_LEFT, wxT("Rotate &left\tCtrl-L"));
- menu->Append(ID_ROTATE_RIGHT, wxT("Rotate &right\tCtrl-R"));
- wxMenuBar *mbar = new wxMenuBar;
- mbar->Append(menu, wxT("&Image"));
- SetMenuBar(mbar);
- mbar->Check(ID_PAINT_BG, true);
- CreateStatusBar(2);
- if ( numImages != 1 )
- SetStatusText(wxString::Format("%d images", numImages), 1);
- SetClientSize(bitmap.GetWidth(), bitmap.GetHeight());
- UpdateStatusBar();
- Show();
- return true;
- }
- void OnEraseBackground(wxEraseEvent& WXUNUSED(event))
- {
- // do nothing here to be able to see how transparent images are shown
- }
- void OnPaint(wxPaintEvent& WXUNUSED(event))
- {
- wxPaintDC dc(this);
- if ( GetMenuBar()->IsChecked(ID_PAINT_BG) )
- dc.Clear();
- dc.SetUserScale(m_zoom, m_zoom);
- const wxSize size = GetClientSize();
- dc.DrawBitmap
- (
- m_bitmap,
- dc.DeviceToLogicalX((size.x - m_zoom*m_bitmap.GetWidth())/2),
- dc.DeviceToLogicalY((size.y - m_zoom*m_bitmap.GetHeight())/2),
- true /* use mask */
- );
- }
- void OnSave(wxCommandEvent& WXUNUSED(event))
- {
- #if wxUSE_FILEDLG
- wxImage image = m_bitmap.ConvertToImage();
- wxString savefilename = wxFileSelector( wxT("Save Image"),
- wxEmptyString,
- wxEmptyString,
- wxEmptyString,
- wxT("BMP files (*.bmp)|*.bmp|")
- #if wxUSE_LIBPNG
- wxT("PNG files (*.png)|*.png|")
- #endif
- #if wxUSE_LIBJPEG
- wxT("JPEG files (*.jpg)|*.jpg|")
- #endif
- #if wxUSE_GIF
- wxT("GIF files (*.gif)|*.gif|")
- #endif
- #if wxUSE_LIBTIFF
- wxT("TIFF files (*.tif)|*.tif|")
- #endif
- #if wxUSE_PCX
- wxT("PCX files (*.pcx)|*.pcx|")
- #endif
- #if wxUSE_XPM
- wxT("X PixMap files (*.xpm)|*.xpm|")
- #endif
- wxT("ICO files (*.ico)|*.ico|")
- wxT("CUR files (*.cur)|*.cur"),
- wxFD_SAVE | wxFD_OVERWRITE_PROMPT,
- this);
- if ( savefilename.empty() )
- return;
- wxString extension;
- wxFileName::SplitPath(savefilename, NULL, NULL, &extension);
- bool saved = false;
- if ( extension == wxT("bmp") )
- {
- static const int bppvalues[] =
- {
- wxBMP_1BPP,
- wxBMP_1BPP_BW,
- wxBMP_4BPP,
- wxBMP_8BPP,
- wxBMP_8BPP_GREY,
- wxBMP_8BPP_RED,
- wxBMP_8BPP_PALETTE,
- wxBMP_24BPP
- };
- const wxString bppchoices[] =
- {
- wxT("1 bpp color"),
- wxT("1 bpp B&W"),
- wxT("4 bpp color"),
- wxT("8 bpp color"),
- wxT("8 bpp greyscale"),
- wxT("8 bpp red"),
- wxT("8 bpp own palette"),
- wxT("24 bpp")
- };
- int bppselection = wxGetSingleChoiceIndex(wxT("Set BMP BPP"),
- wxT("Image sample: save file"),
- WXSIZEOF(bppchoices),
- bppchoices,
- this);
- if ( bppselection != -1 )
- {
- int format = bppvalues[bppselection];
- image.SetOption(wxIMAGE_OPTION_BMP_FORMAT, format);
- if ( format == wxBMP_8BPP_PALETTE )
- {
- unsigned char *cmap = new unsigned char [256];
- for ( int i = 0; i < 256; i++ )
- cmap[i] = (unsigned char)i;
- image.SetPalette(wxPalette(256, cmap, cmap, cmap));
- delete[] cmap;
- }
- }
- }
- #if wxUSE_LIBPNG
- else if ( extension == wxT("png") )
- {
- static const int pngvalues[] =
- {
- wxPNG_TYPE_COLOUR,
- wxPNG_TYPE_COLOUR,
- wxPNG_TYPE_GREY,
- wxPNG_TYPE_GREY,
- wxPNG_TYPE_GREY_RED,
- wxPNG_TYPE_GREY_RED,
- };
- const wxString pngchoices[] =
- {
- wxT("Colour 8bpp"),
- wxT("Colour 16bpp"),
- wxT("Grey 8bpp"),
- wxT("Grey 16bpp"),
- wxT("Grey red 8bpp"),
- wxT("Grey red 16bpp"),
- };
- int sel = wxGetSingleChoiceIndex(wxT("Set PNG format"),
- wxT("Image sample: save file"),
- WXSIZEOF(pngchoices),
- pngchoices,
- this);
- if ( sel != -1 )
- {
- image.SetOption(wxIMAGE_OPTION_PNG_FORMAT, pngvalues[sel]);
- image.SetOption(wxIMAGE_OPTION_PNG_BITDEPTH, sel % 2 ? 16 : 8);
- // these values are taken from OptiPNG with -o3 switch
- const wxString compressionChoices[] =
- {
- wxT("compression = 9, memory = 8, strategy = 0, filter = 0"),
- wxT("compression = 9, memory = 9, strategy = 0, filter = 0"),
- wxT("compression = 9, memory = 8, strategy = 1, filter = 0"),
- wxT("compression = 9, memory = 9, strategy = 1, filter = 0"),
- wxT("compression = 1, memory = 8, strategy = 2, filter = 0"),
- wxT("compression = 1, memory = 9, strategy = 2, filter = 0"),
- wxT("compression = 9, memory = 8, strategy = 0, filter = 5"),
- wxT("compression = 9, memory = 9, strategy = 0, filter = 5"),
- wxT("compression = 9, memory = 8, strategy = 1, filter = 5"),
- wxT("compression = 9, memory = 9, strategy = 1, filter = 5"),
- wxT("compression = 1, memory = 8, strategy = 2, filter = 5"),
- wxT("compression = 1, memory = 9, strategy = 2, filter = 5"),
- };
- int sel = wxGetSingleChoiceIndex(wxT("Select compression option (Cancel to use default)\n"),
- wxT("PNG Compression Options"),
- WXSIZEOF(compressionChoices),
- compressionChoices,
- this);
- if (sel != -1)
- {
- const int zc[] = {9, 9, 9, 9, 1, 1, 9, 9, 9, 9, 1, 1};
- const int zm[] = {8, 9, 8, 9, 8, 9, 8, 9, 8, 9, 8, 9};
- const int zs[] = {0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2};
- const int f[] = {0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
- 0xF8, 0xF8, 0xF8, 0xF8, 0xF8, 0xF8};
- image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_LEVEL , zc[sel]);
- image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_MEM_LEVEL , zm[sel]);
- image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_STRATEGY , zs[sel]);
- image.SetOption(wxIMAGE_OPTION_PNG_FILTER , f[sel]);
- image.SetOption(wxIMAGE_OPTION_PNG_COMPRESSION_BUFFER_SIZE, 1048576); // 1 MB
- }
- }
- }
- #endif // wxUSE_LIBPNG
- else if ( extension == wxT("cur") )
- {
- image.Rescale(32,32);
- image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 0);
- image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 0);
- // This shows how you can save an image with explicitly
- // specified image format:
- saved = image.SaveFile(savefilename, wxBITMAP_TYPE_CUR);
- }
- if ( !saved )
- {
- // This one guesses image format from filename extension
- // (it may fail if the extension is not recognized):
- image.SaveFile(savefilename);
- }
- #endif // wxUSE_FILEDLG
- }
- void OnResize(wxCommandEvent& WXUNUSED(event))
- {
- wxImage img(m_bitmap.ConvertToImage());
- const wxSize size = GetClientSize();
- img.Rescale(size.x, size.y, wxIMAGE_QUALITY_HIGH);
- m_bitmap = wxBitmap(img);
- UpdateStatusBar();
- }
- void OnZoom(wxCommandEvent& event)
- {
- if ( event.GetId() == wxID_ZOOM_IN )
- m_zoom *= 1.2;
- else if ( event.GetId() == wxID_ZOOM_OUT )
- m_zoom /= 1.2;
- else // wxID_ZOOM_100
- m_zoom = 1.;
- UpdateStatusBar();
- }
- void OnRotate(wxCommandEvent& event)
- {
- double angle = 5;
- if ( event.GetId() == ID_ROTATE_LEFT )
- angle = -angle;
- wxImage img(m_bitmap.ConvertToImage());
- img = img.Rotate(angle, wxPoint(img.GetWidth() / 2, img.GetHeight() / 2));
- if ( !img.IsOk() )
- {
- wxLogWarning(wxT("Rotation failed"));
- return;
- }
- m_bitmap = wxBitmap(img);
- UpdateStatusBar();
- }
- void UpdateStatusBar()
- {
- wxLogStatus(this, wxT("Image size: (%d, %d), zoom %.2f"),
- m_bitmap.GetWidth(),
- m_bitmap.GetHeight(),
- m_zoom);
- Refresh();
- }
- wxBitmap m_bitmap;
- double m_zoom;
- wxDECLARE_EVENT_TABLE();
- };
- #ifdef wxHAVE_RAW_BITMAP
- #include "wx/rawbmp.h"
- class MyRawBitmapFrame : public wxFrame
- {
- public:
- enum
- {
- BORDER = 15,
- SIZE = 150,
- REAL_SIZE = SIZE - 2*BORDER
- };
- MyRawBitmapFrame(wxFrame *parent)
- : wxFrame(parent, wxID_ANY, wxT("Raw bitmaps (how exciting)")),
- m_bitmap(SIZE, SIZE, 24),
- m_alphaBitmap(SIZE, SIZE, 32)
- {
- SetClientSize(SIZE, SIZE*2+25);
- InitAlphaBitmap();
- InitBitmap();
- }
- void InitAlphaBitmap()
- {
- // First, clear the whole bitmap by making it alpha
- {
- wxAlphaPixelData data( m_alphaBitmap, wxPoint(0,0), wxSize(SIZE, SIZE) );
- if ( !data )
- {
- wxLogError(wxT("Failed to gain raw access to bitmap data"));
- return;
- }
- wxAlphaPixelData::Iterator p(data);
- for ( int y = 0; y < SIZE; ++y )
- {
- wxAlphaPixelData::Iterator rowStart = p;
- for ( int x = 0; x < SIZE; ++x )
- {
- p.Alpha() = 0;
- ++p; // same as p.OffsetX(1)
- }
- p = rowStart;
- p.OffsetY(data, 1);
- }
- }
- // Then, draw colourful alpha-blended stripes
- wxAlphaPixelData data(m_alphaBitmap, wxPoint(BORDER, BORDER),
- wxSize(REAL_SIZE, REAL_SIZE));
- if ( !data )
- {
- wxLogError(wxT("Failed to gain raw access to bitmap data"));
- return;
- }
- wxAlphaPixelData::Iterator p(data);
- for ( int y = 0; y < REAL_SIZE; ++y )
- {
- wxAlphaPixelData::Iterator rowStart = p;
- int r = y < REAL_SIZE/3 ? 255 : 0,
- g = (REAL_SIZE/3 <= y) && (y < 2*(REAL_SIZE/3)) ? 255 : 0,
- b = 2*(REAL_SIZE/3) <= y ? 255 : 0;
- for ( int x = 0; x < REAL_SIZE; ++x )
- {
- // note that RGB must be premultiplied by alpha
- unsigned a = (wxAlphaPixelData::Iterator::ChannelType)((x*255.)/REAL_SIZE);
- p.Red() = r * a / 256;
- p.Green() = g * a / 256;
- p.Blue() = b * a / 256;
- p.Alpha() = a;
- ++p; // same as p.OffsetX(1)
- }
- p = rowStart;
- p.OffsetY(data, 1);
- }
- }
- void InitBitmap()
- {
- // draw some colourful stripes without alpha
- wxNativePixelData data(m_bitmap);
- if ( !data )
- {
- wxLogError(wxT("Failed to gain raw access to bitmap data"));
- return;
- }
- wxNativePixelData::Iterator p(data);
- for ( int y = 0; y < SIZE; ++y )
- {
- wxNativePixelData::Iterator rowStart = p;
- int r = y < SIZE/3 ? 255 : 0,
- g = (SIZE/3 <= y) && (y < 2*(SIZE/3)) ? 255 : 0,
- b = 2*(SIZE/3) <= y ? 255 : 0;
- for ( int x = 0; x < SIZE; ++x )
- {
- p.Red() = r;
- p.Green() = g;
- p.Blue() = b;
- ++p; // same as p.OffsetX(1)
- }
- p = rowStart;
- p.OffsetY(data, 1);
- }
- }
- void OnPaint(wxPaintEvent& WXUNUSED(event))
- {
- wxPaintDC dc( this );
- dc.DrawText(wxT("This is alpha and raw bitmap test"), 0, BORDER);
- dc.DrawText(wxT("This is alpha and raw bitmap test"), 0, SIZE/2 - BORDER);
- dc.DrawText(wxT("This is alpha and raw bitmap test"), 0, SIZE - 2*BORDER);
- dc.DrawBitmap( m_alphaBitmap, 0, 0, true /* use mask */ );
- dc.DrawText(wxT("Raw bitmap access without alpha"), 0, SIZE+5);
- dc.DrawBitmap( m_bitmap, 0, SIZE+5+dc.GetCharHeight());
- }
- private:
- wxBitmap m_bitmap;
- wxBitmap m_alphaBitmap;
- wxDECLARE_EVENT_TABLE();
- };
- #endif // wxHAVE_RAW_BITMAP
- // ============================================================================
- // implementations
- // ============================================================================
- //-----------------------------------------------------------------------------
- // MyImageFrame
- //-----------------------------------------------------------------------------
- wxBEGIN_EVENT_TABLE(MyImageFrame, wxFrame)
- EVT_ERASE_BACKGROUND(MyImageFrame::OnEraseBackground)
- EVT_PAINT(MyImageFrame::OnPaint)
- EVT_MENU(wxID_SAVEAS, MyImageFrame::OnSave)
- EVT_MENU_RANGE(ID_ROTATE_LEFT, ID_ROTATE_RIGHT, MyImageFrame::OnRotate)
- EVT_MENU(ID_RESIZE, MyImageFrame::OnResize)
- EVT_MENU(wxID_ZOOM_IN, MyImageFrame::OnZoom)
- EVT_MENU(wxID_ZOOM_OUT, MyImageFrame::OnZoom)
- EVT_MENU(wxID_ZOOM_100, MyImageFrame::OnZoom)
- wxEND_EVENT_TABLE()
- //-----------------------------------------------------------------------------
- // MyRawBitmapFrame
- //-----------------------------------------------------------------------------
- #ifdef wxHAVE_RAW_BITMAP
- wxBEGIN_EVENT_TABLE(MyRawBitmapFrame, wxFrame)
- EVT_PAINT(MyRawBitmapFrame::OnPaint)
- wxEND_EVENT_TABLE()
- #endif // wxHAVE_RAW_BITMAP
- //-----------------------------------------------------------------------------
- // MyFrame
- //-----------------------------------------------------------------------------
- enum
- {
- ID_QUIT = wxID_EXIT,
- ID_ABOUT = wxID_ABOUT,
- ID_NEW = 100,
- ID_INFO,
- ID_SHOWRAW,
- ID_GRAPHICS,
- ID_SHOWTHUMBNAIL
- };
- IMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame )
- wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
- EVT_MENU (ID_ABOUT, MyFrame::OnAbout)
- EVT_MENU (ID_QUIT, MyFrame::OnQuit)
- EVT_MENU (ID_NEW, MyFrame::OnNewFrame)
- EVT_MENU (ID_INFO, MyFrame::OnImageInfo)
- EVT_MENU (ID_SHOWTHUMBNAIL, MyFrame::OnThumbnail)
- #ifdef wxHAVE_RAW_BITMAP
- EVT_MENU (ID_SHOWRAW, MyFrame::OnTestRawBitmap)
- #endif
- #if wxUSE_GRAPHICS_CONTEXT
- EVT_MENU (ID_GRAPHICS, MyFrame::OnTestGraphics)
- #endif // wxUSE_GRAPHICS_CONTEXT
- #if wxUSE_CLIPBOARD
- EVT_MENU(wxID_COPY, MyFrame::OnCopy)
- EVT_MENU(wxID_PASTE, MyFrame::OnPaste)
- #endif // wxUSE_CLIPBOARD
- wxEND_EVENT_TABLE()
- MyFrame::MyFrame()
- : wxFrame( (wxFrame *)NULL, wxID_ANY, wxT("wxImage sample"),
- wxPoint(20, 20), wxSize(950, 700) )
- {
- SetIcon(wxICON(sample));
- wxMenuBar *menu_bar = new wxMenuBar();
- wxMenu *menuImage = new wxMenu;
- menuImage->Append( ID_NEW, wxT("&Show any image...\tCtrl-O"));
- menuImage->Append( ID_INFO, wxT("Show image &information...\tCtrl-I"));
- #ifdef wxHAVE_RAW_BITMAP
- menuImage->AppendSeparator();
- menuImage->Append( ID_SHOWRAW, wxT("Test &raw bitmap...\tCtrl-R"));
- #endif
- #if wxUSE_GRAPHICS_CONTEXT
- menuImage->AppendSeparator();
- menuImage->Append(ID_GRAPHICS, "Test &graphics context...\tCtrl-G");
- #endif // wxUSE_GRAPHICS_CONTEXT
- menuImage->AppendSeparator();
- menuImage->Append( ID_SHOWTHUMBNAIL, wxT("Test &thumbnail...\tCtrl-T"),
- "Test scaling the image during load (try with JPEG)");
- menuImage->AppendSeparator();
- menuImage->Append( ID_ABOUT, wxT("&About\tF1"));
- menuImage->AppendSeparator();
- menuImage->Append( ID_QUIT, wxT("E&xit\tCtrl-Q"));
- menu_bar->Append(menuImage, wxT("&Image"));
- #if wxUSE_CLIPBOARD
- wxMenu *menuClipboard = new wxMenu;
- menuClipboard->Append(wxID_COPY, wxT("&Copy test image\tCtrl-C"));
- menuClipboard->Append(wxID_PASTE, wxT("&Paste image\tCtrl-V"));
- menu_bar->Append(menuClipboard, wxT("&Clipboard"));
- #endif // wxUSE_CLIPBOARD
- SetMenuBar( menu_bar );
- #if wxUSE_STATUSBAR
- CreateStatusBar(2);
- int widths[] = { -1, 100 };
- SetStatusWidths( 2, widths );
- #endif // wxUSE_STATUSBAR
- m_canvas = new MyCanvas( this, wxID_ANY, wxPoint(0,0), wxSize(10,10) );
- // 500 width * 2750 height
- m_canvas->SetScrollbars( 10, 10, 50, 275 );
- m_canvas->SetCursor(wxImage("cursor.png"));
- }
- void MyFrame::OnQuit( wxCommandEvent &WXUNUSED(event) )
- {
- Close( true );
- }
- #if wxUSE_ZLIB && wxUSE_STREAMS
- #include "wx/zstream.h"
- #endif
- void MyFrame::OnAbout( wxCommandEvent &WXUNUSED(event) )
- {
- wxArrayString array;
- array.Add("wxImage demo");
- array.Add("(c) Robert Roebling 1998-2005");
- array.Add("(c) Vadim Zeitlin 2005-2009");
- array.Add(wxEmptyString);
- array.Add("Version of the libraries used:");
- #if wxUSE_LIBPNG
- array.Add(wxPNGHandler::GetLibraryVersionInfo().ToString());
- #endif
- #if wxUSE_LIBJPEG
- array.Add(wxJPEGHandler::GetLibraryVersionInfo().ToString());
- #endif
- #if wxUSE_LIBTIFF
- array.Add(wxTIFFHandler::GetLibraryVersionInfo().ToString());
- #endif
- #if wxUSE_ZLIB && wxUSE_STREAMS
- // zlib is used by libpng
- array.Add(wxGetZlibVersionInfo().ToString());
- #endif
- (void)wxMessageBox( wxJoin(array, '\n'),
- "About wxImage Demo",
- wxICON_INFORMATION | wxOK );
- }
- wxString MyFrame::LoadUserImage(wxImage& image)
- {
- wxString filename;
- #if wxUSE_FILEDLG
- filename = wxLoadFileSelector(wxT("image"), wxEmptyString);
- if ( !filename.empty() )
- {
- if ( !image.LoadFile(filename) )
- {
- wxLogError(wxT("Couldn't load image from '%s'."), filename.c_str());
- return wxEmptyString;
- }
- }
- #endif // wxUSE_FILEDLG
- return filename;
- }
- void MyFrame::OnNewFrame( wxCommandEvent &WXUNUSED(event) )
- {
- wxImage image;
- wxString filename = LoadUserImage(image);
- if ( !filename.empty() )
- new MyImageFrame(this, filename, image);
- }
- void MyFrame::OnImageInfo( wxCommandEvent &WXUNUSED(event) )
- {
- wxImage image;
- if ( !LoadUserImage(image).empty() )
- {
- // TODO: show more information about the file
- wxString info = wxString::Format("Image size: %dx%d",
- image.GetWidth(),
- image.GetHeight());
- int xres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX),
- yres = image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY);
- if ( xres || yres )
- {
- info += wxString::Format("\nResolution: %dx%d", xres, yres);
- switch ( image.GetOptionInt(wxIMAGE_OPTION_RESOLUTIONUNIT) )
- {
- default:
- wxFAIL_MSG( "unknown image resolution units" );
- // fall through
- case wxIMAGE_RESOLUTION_NONE:
- info += " in default units";
- break;
- case wxIMAGE_RESOLUTION_INCHES:
- info += " in";
- break;
- case wxIMAGE_RESOLUTION_CM:
- info += " cm";
- break;
- }
- }
- wxLogMessage("%s", info);
- }
- }
- #ifdef wxHAVE_RAW_BITMAP
- void MyFrame::OnTestRawBitmap( wxCommandEvent &WXUNUSED(event) )
- {
- (new MyRawBitmapFrame(this))->Show();
- }
- #endif // wxHAVE_RAW_BITMAP
- #if wxUSE_GRAPHICS_CONTEXT
- class MyGraphicsFrame : public wxFrame
- {
- public:
- enum
- {
- WIDTH = 256,
- HEIGHT = 90
- };
- MyGraphicsFrame(wxWindow* parent) :
- wxFrame(parent, wxID_ANY, "Graphics context test"),
- m_image(WIDTH, HEIGHT, false)
- {
- // Create a test image: it has 3 horizontal primary colour bands with
- // alpha increasing from left to right.
- m_image.SetAlpha();
- unsigned char* alpha = m_image.GetAlpha();
- unsigned char* data = m_image.GetData();
- for ( int y = 0; y < HEIGHT; y++ )
- {
- unsigned char r = 0,
- g = 0,
- b = 0;
- if ( y < HEIGHT/3 )
- r = 0xff;
- else if ( y < (2*HEIGHT)/3 )
- g = 0xff;
- else
- b = 0xff;
- for ( int x = 0; x < WIDTH; x++ )
- {
- *alpha++ = x;
- *data++ = r;
- *data++ = g;
- *data++ = b;
- }
- }
- m_bitmap = wxBitmap(m_image);
- Connect(wxEVT_PAINT, wxPaintEventHandler(MyGraphicsFrame::OnPaint));
- Show();
- }
- private:
- void OnPaint(wxPaintEvent& WXUNUSED(event))
- {
- wxPaintDC dc(this);
- wxScopedPtr<wxGraphicsContext> gc(wxGraphicsContext::Create(dc));
- wxGraphicsBitmap gb(gc->CreateBitmapFromImage(m_image));
- gc->SetFont(*wxNORMAL_FONT, *wxBLACK);
- gc->DrawText("Bitmap", 0, HEIGHT/2);
- gc->DrawBitmap(m_bitmap, 0, 0, WIDTH, HEIGHT);
- wxGraphicsFont gf = gc->CreateFont(wxNORMAL_FONT->GetPixelSize().y, "");
- gc->SetFont(gf);
- gc->DrawText("Graphics bitmap", 0, (3*HEIGHT)/2);
- gc->DrawBitmap(gb, 0, HEIGHT, WIDTH, HEIGHT);
- }
- wxImage m_image;
- wxBitmap m_bitmap;
- wxDECLARE_NO_COPY_CLASS(MyGraphicsFrame);
- };
- void MyFrame::OnTestGraphics(wxCommandEvent& WXUNUSED(event))
- {
- new MyGraphicsFrame(this);
- }
- #endif // wxUSE_GRAPHICS_CONTEXT
- #if wxUSE_CLIPBOARD
- void MyFrame::OnCopy(wxCommandEvent& WXUNUSED(event))
- {
- wxBitmapDataObject *dobjBmp = new wxBitmapDataObject;
- dobjBmp->SetBitmap(m_canvas->my_horse_png);
- wxTheClipboard->Open();
- if ( !wxTheClipboard->SetData(dobjBmp) )
- {
- wxLogError(wxT("Failed to copy bitmap to clipboard"));
- }
- wxTheClipboard->Close();
- }
- void MyFrame::OnPaste(wxCommandEvent& WXUNUSED(event))
- {
- wxBitmapDataObject dobjBmp;
- wxTheClipboard->Open();
- if ( !wxTheClipboard->GetData(dobjBmp) )
- {
- wxLogMessage(wxT("No bitmap data in the clipboard"));
- }
- else
- {
- new MyImageFrame(this, wxT("Clipboard"), dobjBmp.GetBitmap());
- }
- wxTheClipboard->Close();
- }
- #endif // wxUSE_CLIPBOARD
- void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) )
- {
- #if wxUSE_FILEDLG
- wxString filename = wxLoadFileSelector(wxT("image"), wxEmptyString, wxEmptyString, this);
- if ( filename.empty() )
- return;
- static const int THUMBNAIL_WIDTH = 320;
- static const int THUMBNAIL_HEIGHT = 240;
- wxImage image;
- image.SetOption(wxIMAGE_OPTION_MAX_WIDTH, THUMBNAIL_WIDTH);
- image.SetOption(wxIMAGE_OPTION_MAX_HEIGHT, THUMBNAIL_HEIGHT);
- wxStopWatch sw;
- if ( !image.LoadFile(filename) )
- {
- wxLogError(wxT("Couldn't load image from '%s'."), filename.c_str());
- return;
- }
- int origWidth = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_WIDTH );
- int origHeight = image.GetOptionInt( wxIMAGE_OPTION_ORIGINAL_HEIGHT );
- const long loadTime = sw.Time();
- MyImageFrame * const frame = new MyImageFrame(this, filename, image);
- wxLogStatus(frame, "Loaded \"%s\" in %ldms; original size was (%d, %d)",
- filename, loadTime, origWidth, origHeight);
- #else
- wxLogError( wxT("Couldn't create file selector dialog") );
- return;
- #endif // wxUSE_FILEDLG
- }
- //-----------------------------------------------------------------------------
- // MyApp
- //-----------------------------------------------------------------------------
- IMPLEMENT_APP(MyApp)
- bool MyApp::OnInit()
- {
- if ( !wxApp::OnInit() )
- return false;
- wxInitAllImageHandlers();
- wxFrame *frame = new MyFrame();
- frame->Show( true );
- return true;
- }
|