From 0e39566b3a666223f5875349cb3182793de2fc1b Mon Sep 17 00:00:00 2001 From: Tomay Date: Sat, 1 May 2021 14:03:04 +0200 Subject: [PATCH] Add wxImage Change{Saturation,Brightness,HSV,Lightness}() Add more functions for manipulating wxImage colours. Show using them in the same and add new unit tests for them. This is a squashed commit of branch 'tomay3000/image-lightness'. Closes https://github.com/wxWidgets/wxWidgets/pull/2310 --- build/cmake/tests/gui/CMakeLists.txt | 9 + include/wx/image.h | 31 +- interface/wx/image.h | 58 +++- samples/image/image.cpp | 284 +++++++++++++++- src/common/image.cpp | 310 +++++++++++------- tests/Makefile.in | 2 +- tests/image/image.cpp | 49 +++ tests/image/toucan.png | Bin 0 -> 12901 bytes tests/image/toucan_bright_-0.259.png | Bin 0 -> 11236 bytes tests/image/toucan_dis_240.png | Bin 0 -> 10987 bytes tests/image/toucan_grey.png | Bin 0 -> 10493 bytes tests/image/toucan_hsv_0.538_-0.41_-0.259.png | Bin 0 -> 11293 bytes tests/image/toucan_hue_0.538.png | Bin 0 -> 11349 bytes tests/image/toucan_light_46.png | Bin 0 -> 10951 bytes tests/image/toucan_mono_255_255_255.png | Bin 0 -> 6072 bytes tests/image/toucan_sat_-0.41.png | Bin 0 -> 11293 bytes tests/makefile.bcc | 2 +- tests/makefile.gcc | 2 +- tests/makefile.vc | 2 +- tests/test.bkl | 10 + 20 files changed, 626 insertions(+), 133 deletions(-) create mode 100644 tests/image/toucan.png create mode 100644 tests/image/toucan_bright_-0.259.png create mode 100644 tests/image/toucan_dis_240.png create mode 100644 tests/image/toucan_grey.png create mode 100644 tests/image/toucan_hsv_0.538_-0.41_-0.259.png create mode 100644 tests/image/toucan_hue_0.538.png create mode 100644 tests/image/toucan_light_46.png create mode 100644 tests/image/toucan_mono_255_255_255.png create mode 100644 tests/image/toucan_sat_-0.41.png diff --git a/build/cmake/tests/gui/CMakeLists.txt b/build/cmake/tests/gui/CMakeLists.txt index a28a975998..0333a85731 100644 --- a/build/cmake/tests/gui/CMakeLists.txt +++ b/build/cmake/tests/gui/CMakeLists.txt @@ -177,6 +177,15 @@ set(TEST_GUI_DATA image/paste_result_no_background_square_over_circle.png image/wx.png image/wx.ico + image/toucan.png + image/toucan_hue_0.538.png + image/toucan_sat_-0.41.png + image/toucan_bright_-0.259.png + image/toucan_hsv_0.538_-0.41_-0.259.png + image/toucan_light_46.png + image/toucan_dis_240.png + image/toucan_grey.png + image/toucan_mono_255_255_255.png intl/ja/internat.mo intl/ja/internat.po ) diff --git a/include/wx/image.h b/include/wx/image.h index 125b8c707d..8831d675c2 100644 --- a/include/wx/image.h +++ b/include/wx/image.h @@ -411,6 +411,9 @@ public: // Convert to disabled (dimmed) image. wxImage ConvertToDisabled(unsigned char brightness = 255) const; + // Convert the image based on the given lightness. + wxImage ChangeLightness(int alpha) const; + // these routines are slow but safe void SetRGB( int x, int y, unsigned char r, unsigned char g, unsigned char b ); void SetRGB( const wxRect& rect, unsigned char r, unsigned char g, unsigned char b ); @@ -555,10 +558,30 @@ public: // Returned value: # of entries in the histogram unsigned long ComputeHistogram( wxImageHistogram &h ) const; - // Rotates the hue of each pixel of the image. angle is a double in the range - // -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees + // Rotates the hue of each pixel in the image by angle, which is a double in + // the range [-1.0..+1.0], where -1.0 corresponds to -360 degrees and +1.0 + // corresponds to +360 degrees. void RotateHue(double angle); + // Changes the saturation of each pixel in the image. factor is a double in + // the range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 + // corresponds to +100 percent. + void ChangeSaturation(double factor); + + // Changes the brightness (value) of each pixel in the image. factor is a + // double in the range [-1.0..+1.0], where -1.0 corresponds to -100 percent + // and +1.0 corresponds to +100 percent. + void ChangeBrightness(double factor); + + // Changes the hue, the saturation and the brightness (value) of each pixel + // in the image. angleH is a double in the range [-1.0..+1.0], where -1.0 + // corresponds to -360 degrees and +1.0 corresponds to +360 degrees, factorS + // is a double in the range [-1.0..+1.0], where -1.0 corresponds to -100 + // percent and +1.0 corresponds to +100 percent and factorV is a double in + // the range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 + // corresponds to +100 percent. + void ChangeHSV(double angleH, double factorS, double factorV); + static wxList& GetHandlers() { return sm_handlers; } static void AddHandler( wxImageHandler *handler ); static void InsertHandler( wxImageHandler *handler ); @@ -649,6 +672,10 @@ protected: virtual wxObjectRefData* CreateRefData() const wxOVERRIDE; virtual wxObjectRefData* CloneRefData(const wxObjectRefData* data) const wxOVERRIDE; + // Helper function used internally by wxImage class only. + template + void ApplyToAllPixels(void (*filter)(wxImage *, unsigned char *, T), T value); + private: friend class WXDLLIMPEXP_FWD_CORE wxImageHandler; diff --git a/interface/wx/image.h b/interface/wx/image.h index 2bf152168c..ff6baefdb5 100644 --- a/interface/wx/image.h +++ b/interface/wx/image.h @@ -897,12 +897,43 @@ public: wxImage Rotate180() const; /** - Rotates the hue of each pixel in the image by @e angle, which is a double in - the range of -1.0 to +1.0, where -1.0 corresponds to -360 degrees and +1.0 + Rotates the hue of each pixel in the image by @e angle, which is a double + in the range [-1.0..+1.0], where -1.0 corresponds to -360 degrees and +1.0 corresponds to +360 degrees. */ void RotateHue(double angle); + /** + Changes the saturation of each pixel in the image. factor is a double in + the range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 + corresponds to +100 percent. + + @since 3.1.6 + */ + void ChangeSaturation(double factor); + + /** + Changes the brightness (value) of each pixel in the image. factor is a + double in the range [-1.0..+1.0], where -1.0 corresponds to -100 percent + and +1.0 corresponds to +100 percent. + + @since 3.1.6 + */ + void ChangeBrightness(double factor); + + /** + Changes the hue, the saturation and the brightness (value) of each pixel + in the image. angleH is a double in the range [-1.0..+1.0], where -1.0 + corresponds to -360 degrees and +1.0 corresponds to +360 degrees, factorS + is a double in the range [-1.0..+1.0], where -1.0 corresponds to -100 percent + and +1.0 corresponds to +100 percent and factorV is a double in the range + [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 corresponds + to +100 percent. + + @since 3.1.6 + */ + void ChangeHSV(double angleH, double factorS, double factorV); + /** Returns a scaled version of the image. @@ -1020,6 +1051,9 @@ public: calculate the greyscale. Defaults to using the standard ITU-T BT.601 when converting to YUV, where every pixel equals (R * @a weight_r) + (G * @a weight_g) + (B * @a weight_b). + + @remarks + This function calls wxColour::MakeGrey() for each pixel in the image. */ wxImage ConvertToGreyscale(double weight_r, double weight_g, double weight_b) const; @@ -1034,15 +1068,35 @@ public: The returned image has white colour where the original has @e (r,g,b) colour and black colour everywhere else. + + @remarks + This function calls wxColour::MakeMono() for each pixel in the image. */ wxImage ConvertToMono(unsigned char r, unsigned char g, unsigned char b) const; /** Returns disabled (dimmed) version of the image. + + @remarks + This function calls wxColour::MakeDisabled() for each pixel in the image. + @since 2.9.0 */ wxImage ConvertToDisabled(unsigned char brightness = 255) const; + /** + Returns a changed version of the image based on the given lightness. + This utility function simply darkens or lightens a color, based on the + specified percentage @a ialpha. @a ialpha of 0 would make the color + completely black, 200 completely white and 100 would not change the color. + + @remarks + This function calls wxColour::ChangeLightness() for each pixel in the image. + + @since 3.1.6 + */ + wxImage ChangeLightness(int alpha) const; + //@} diff --git a/samples/image/image.cpp b/samples/image/image.cpp index 4ecbf16203..ec3b894310 100644 --- a/samples/image/image.cpp +++ b/samples/image/image.cpp @@ -27,6 +27,8 @@ #include "wx/scopedptr.h" #include "wx/stopwatch.h" #include "wx/versioninfo.h" +#include "wx/artprov.h" +#include "wx/spinctrl.h" #if wxUSE_CLIPBOARD #include "wx/dataobj.h" @@ -78,6 +80,7 @@ public: void OnNewFrameHiDPI(wxCommandEvent&); void OnImageInfo( wxCommandEvent &event ); void OnThumbnail( wxCommandEvent &event ); + void OnFilters(wxCommandEvent& event); void OnUpdateNewFrameHiDPI(wxUpdateUIEvent&); #ifdef wxHAVE_RAW_BITMAP @@ -104,7 +107,10 @@ private: // image or were cancelled by user static wxString LoadUserImage(wxImage& image); +private: + friend class MyFiltersFrame; +private: wxDECLARE_DYNAMIC_CLASS(MyFrame); wxDECLARE_EVENT_TABLE(); }; @@ -651,6 +657,272 @@ private: #endif // wxHAVE_RAW_BITMAP +class MyFiltersFrame : public wxFrame +{ +public: + MyFiltersFrame(wxWindow *parent) + : wxFrame(parent, wxID_ANY, "Image filters test") + { + wxMenu *menuImage = new wxMenu; + + menuImage->Append(wxID_OPEN, "&Open...\tCtrl-O", "Load a user defined image"); + menuImage->Append(wxID_RESET, "&Reset\tCtrl-R", "Reset all the image filters"); + menuImage->Append(wxID_CLOSE, "&Close\tCtrl-Q", "Close this frame"); + + wxMenuBar *menuBar = new wxMenuBar(); + menuBar->Append(menuImage, "&Image"); + SetMenuBar(menuBar); + + wxSizerFlags sizerFlags1(1); + sizerFlags1.Border().Expand(); + + wxSizerFlags sizerFlags2; + sizerFlags2.Border().Expand(); + + wxSizerFlags sizerFlags3; + sizerFlags3.Border().Center(); + + wxSizerFlags sizerFlags4; + sizerFlags4.Border(); + + wxStaticBoxSizer *sizerHue = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Hue (°)")), wxVERTICAL); + m_sliderHue = new wxSlider(sizerHue->GetStaticBox(), wxID_ANY, 0, -360, 360, + wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL | wxSL_LABELS); + sizerHue->Add(m_sliderHue, sizerFlags2); + + wxStaticBoxSizer *sizerSaturation = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Saturation (%)")), wxVERTICAL); + m_sliderSaturation = new wxSlider(sizerSaturation->GetStaticBox(), wxID_ANY, + 0, -100, 100, wxDefaultPosition, wxDefaultSize, + wxSL_HORIZONTAL | wxSL_LABELS); + sizerSaturation->Add(m_sliderSaturation, sizerFlags2); + + wxStaticBoxSizer *sizerBrightness = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Brightness (value) (%)")), + wxVERTICAL); + m_sliderBrightness = new wxSlider(sizerBrightness->GetStaticBox(), wxID_ANY, + 0, -100, 100, wxDefaultPosition, wxDefaultSize, + wxSL_HORIZONTAL | wxSL_LABELS); + sizerBrightness->Add(m_sliderBrightness, sizerFlags2); + + wxStaticBoxSizer *sizerLightness = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Lightness")), + wxVERTICAL); + m_sliderLightness = new wxSlider(sizerLightness->GetStaticBox(), wxID_ANY, + 100, 0, 200, wxDefaultPosition, wxDefaultSize, + wxSL_HORIZONTAL | wxSL_LABELS); + sizerLightness->Add(m_sliderLightness, sizerFlags2); + + wxStaticBoxSizer *sizerDisabled = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Disabled")), wxVERTICAL); + m_checkDisabled = new wxCheckBox(sizerDisabled->GetStaticBox(), wxID_ANY, + wxS("Convert to disabled")); + m_sliderDisabled = new wxSlider(sizerDisabled->GetStaticBox(), wxID_ANY, + 255, 0, 255, wxDefaultPosition, wxDefaultSize, + wxSL_HORIZONTAL | wxSL_LABELS); + sizerDisabled->Add(m_checkDisabled, sizerFlags4); + sizerDisabled->Add(m_sliderDisabled, sizerFlags2); + + wxStaticBoxSizer *sizerGrey = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Greyscale")), wxVERTICAL); + m_checkGrey = new wxCheckBox(sizerGrey->GetStaticBox(), wxID_ANY, + wxS("Convert to greyscale")); + wxBoxSizer *sizer1 = new wxBoxSizer(wxHORIZONTAL); + m_spinGreyWeightR = new wxSpinCtrlDouble(sizerGrey->GetStaticBox(), + wxID_ANY, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxSP_ARROW_KEYS, 0, 1, 0.299, 0.001); + m_spinGreyWeightG = new wxSpinCtrlDouble(sizerGrey->GetStaticBox(), + wxID_ANY, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxSP_ARROW_KEYS, 0, 1, 0.587, 0.001); + m_spinGreyWeightB = new wxSpinCtrlDouble(sizerGrey->GetStaticBox(), + wxID_ANY, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxSP_ARROW_KEYS, 0, 1, 0.114, 0.001); + sizer1->AddStretchSpacer(); + sizer1->Add(new wxStaticText(sizerGrey->GetStaticBox(), wxID_ANY, + wxS("Red weight:")), sizerFlags3); + sizer1->Add(m_spinGreyWeightR, sizerFlags3); + sizer1->Add(new wxStaticText(sizerGrey->GetStaticBox(), wxID_ANY, + wxS("Green weight:")), sizerFlags3); + sizer1->Add(m_spinGreyWeightG, sizerFlags3); + sizer1->Add(new wxStaticText(sizerGrey->GetStaticBox(), wxID_ANY, + wxS("Blue weight:")), sizerFlags3); + sizer1->Add(m_spinGreyWeightB, sizerFlags3); + sizer1->AddStretchSpacer(); + sizerGrey->Add(m_checkGrey, sizerFlags4); + sizerGrey->Add(sizer1, sizerFlags2); + + wxStaticBoxSizer *sizerMono = new wxStaticBoxSizer(new wxStaticBox(this, + wxID_ANY, wxS("Monochrome")), wxVERTICAL); + m_checkMono = new wxCheckBox(sizerMono->GetStaticBox(), wxID_ANY, + wxS("Convert to monochrome")); + wxBoxSizer *sizer2 = new wxBoxSizer(wxHORIZONTAL); + m_spinMonoR = new wxSpinCtrl(sizerMono->GetStaticBox(), wxID_ANY, + wxEmptyString, wxDefaultPosition, wxDefaultSize, + wxSP_ARROW_KEYS, 0, 255, 0); + m_spinMonoG = new wxSpinCtrl(sizerMono->GetStaticBox(), wxID_ANY, + wxEmptyString, wxDefaultPosition, wxDefaultSize, + wxSP_ARROW_KEYS, 0, 255, 0); + m_spinMonoB = new wxSpinCtrl(sizerMono->GetStaticBox(), wxID_ANY, + wxEmptyString, wxDefaultPosition, wxDefaultSize, + wxSP_ARROW_KEYS, 0, 255, 0); + sizer2->AddStretchSpacer(); + sizer2->Add(new wxStaticText(sizerMono->GetStaticBox(), wxID_ANY, + wxS("Red:")), sizerFlags3); + sizer2->Add(m_spinMonoR, sizerFlags3); + sizer2->Add(new wxStaticText(sizerMono->GetStaticBox(), wxID_ANY, + wxS("Green:")), sizerFlags3); + sizer2->Add(m_spinMonoG, sizerFlags3); + sizer2->Add(new wxStaticText(sizerMono->GetStaticBox(), wxID_ANY, + wxS("Blue:")), sizerFlags3); + sizer2->Add(m_spinMonoB, sizerFlags3); + sizer2->AddStretchSpacer(); + sizerMono->Add(m_checkMono, sizerFlags4); + sizerMono->Add(sizer2, sizerFlags2); + + wxBoxSizer *sizerLeft = new wxBoxSizer(wxVERTICAL); + sizerLeft->Add(sizerHue, sizerFlags2); + sizerLeft->Add(sizerSaturation, sizerFlags2); + sizerLeft->Add(sizerBrightness, sizerFlags2); + sizerLeft->Add(sizerLightness, sizerFlags2); + + wxBoxSizer *sizerRight = new wxBoxSizer(wxVERTICAL); + sizerRight->Add(sizerDisabled, sizerFlags2); + sizerRight->Add(sizerGrey, sizerFlags2); + sizerRight->Add(sizerMono, sizerFlags2); + + wxBitmap bitmap = wxArtProvider::GetBitmap(wxART_INFORMATION, wxART_BUTTON, + wxSize(256, 256)); + m_image = bitmap.ConvertToImage(); + + m_stcBitmap = new wxStaticBitmap(this, wxID_ANY, bitmap); + wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL); + sizerTop->AddStretchSpacer(); + sizerTop->Add(m_stcBitmap, sizerFlags1); + sizerTop->AddStretchSpacer(); + + sizerFlags1.Border(0); + + wxBoxSizer *sizerBottom = new wxBoxSizer(wxHORIZONTAL); + sizerBottom->Add(sizerLeft, sizerFlags1); + sizerBottom->Add(sizerRight, sizerFlags1); + + wxBoxSizer *sizerMain = new wxBoxSizer(wxVERTICAL); + sizerMain->Add(sizerTop, sizerFlags1); + sizerMain->Add(sizerBottom, sizerFlags2); + + SetSizer(sizerMain); + CreateStatusBar(); + + // Bind Events + Bind(wxEVT_MENU, &MyFiltersFrame::OnNewImage, this, wxID_OPEN); + Bind(wxEVT_MENU, &MyFiltersFrame::OnReset, this, wxID_RESET); + Bind(wxEVT_MENU, &MyFiltersFrame::OnClose, this, wxID_CLOSE); + m_sliderHue->Bind(wxEVT_SLIDER, &MyFiltersFrame::OnFilter, this); + m_sliderSaturation->Bind(wxEVT_SLIDER, &MyFiltersFrame::OnFilter, this); + m_sliderBrightness->Bind(wxEVT_SLIDER, &MyFiltersFrame::OnFilter, this); + m_sliderLightness->Bind(wxEVT_SLIDER, &MyFiltersFrame::OnFilter, this); + m_checkDisabled->Bind(wxEVT_CHECKBOX, &MyFiltersFrame::OnFilter, this); + m_sliderDisabled->Bind(wxEVT_SLIDER, &MyFiltersFrame::OnFilter, this); + m_checkGrey->Bind(wxEVT_CHECKBOX, &MyFiltersFrame::OnFilter, this); + m_spinGreyWeightR->Bind(wxEVT_SPINCTRLDOUBLE, &MyFiltersFrame::OnFilter, this); + m_spinGreyWeightG->Bind(wxEVT_SPINCTRLDOUBLE, &MyFiltersFrame::OnFilter, this); + m_spinGreyWeightB->Bind(wxEVT_SPINCTRLDOUBLE, &MyFiltersFrame::OnFilter, this); + m_checkMono->Bind(wxEVT_CHECKBOX, &MyFiltersFrame::OnFilter, this); + m_spinMonoR->Bind(wxEVT_SPINCTRL, &MyFiltersFrame::OnFilter, this); + m_spinMonoG->Bind(wxEVT_SPINCTRL, &MyFiltersFrame::OnFilter, this); + m_spinMonoB->Bind(wxEVT_SPINCTRL, &MyFiltersFrame::OnFilter, this); + } + +private: + wxStaticBitmap *m_stcBitmap; + wxSlider *m_sliderHue; + wxSlider *m_sliderSaturation; + wxSlider *m_sliderBrightness; + wxSlider *m_sliderLightness; + wxCheckBox *m_checkDisabled; + wxSlider *m_sliderDisabled; + wxCheckBox *m_checkGrey; + wxSpinCtrlDouble *m_spinGreyWeightR; + wxSpinCtrlDouble *m_spinGreyWeightG; + wxSpinCtrlDouble *m_spinGreyWeightB; + wxCheckBox *m_checkMono; + wxSpinCtrl *m_spinMonoR; + wxSpinCtrl *m_spinMonoG; + wxSpinCtrl *m_spinMonoB; + wxImage m_image; + +protected: + void OnNewImage(wxCommandEvent& WXUNUSED(event)) + { + wxImage image; + wxString filename = static_cast(GetParent())->LoadUserImage(image); + + if ( !filename.empty() ) + { + m_image = image; + DoFilter(); + } + } + + void OnReset(wxCommandEvent& WXUNUSED(event)) + { + m_stcBitmap->SetBitmap(m_image); + m_sliderHue->SetValue(0); + m_sliderSaturation->SetValue(0); + m_sliderBrightness->SetValue(0); + m_sliderLightness->SetValue(100); + m_checkDisabled->SetValue(false); + m_sliderDisabled->SetValue(255); + m_checkGrey->SetValue(false); + m_spinGreyWeightR->SetValue(0.299); + m_spinGreyWeightG->SetValue(0.587); + m_spinGreyWeightB->SetValue(0.114); + m_checkMono->SetValue(false); + m_spinMonoR->SetValue(0); + m_spinMonoG->SetValue(0); + m_spinMonoB->SetValue(0); + } + + void OnClose(wxCommandEvent& WXUNUSED(event)) + { + Close(true); + } + + virtual void OnFilter(wxEvent& WXUNUSED(event)) + { + DoFilter(); + } + + void DoFilter() + { + wxImage image = m_image; + image.RotateHue(m_sliderHue->GetValue() / 360.); + image.ChangeSaturation(m_sliderSaturation->GetValue() / 100.); + image.ChangeBrightness(m_sliderBrightness->GetValue() / 100.); + image = image.ChangeLightness(m_sliderLightness->GetValue()); + + if ( m_checkDisabled->IsChecked() ) + image = image.ConvertToDisabled(m_sliderDisabled->GetValue()); + + if ( m_checkGrey->IsChecked() ) + { + image = image.ConvertToGreyscale(m_spinGreyWeightR->GetValue(), + m_spinGreyWeightG->GetValue(), + m_spinGreyWeightB->GetValue()); + } + + if ( m_checkMono->IsChecked() ) + { + image = image.ConvertToMono(m_spinMonoR->GetValue(), + m_spinMonoG->GetValue(), + m_spinMonoB->GetValue()); + } + + m_stcBitmap->SetBitmap(image); + Layout(); + } +}; // ============================================================================ // implementations @@ -700,7 +972,8 @@ enum ID_GRAPHICS, ID_SHOWTHUMBNAIL, ID_COPY_IMAGE, - ID_PASTE_IMAGE + ID_PASTE_IMAGE, + ID_FILTERS }; wxIMPLEMENT_DYNAMIC_CLASS( MyFrame, wxFrame ); @@ -711,6 +984,7 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU (ID_NEW_HIDPI, MyFrame::OnNewFrameHiDPI) EVT_MENU (ID_INFO, MyFrame::OnImageInfo) EVT_MENU (ID_SHOWTHUMBNAIL, MyFrame::OnThumbnail) + EVT_MENU (ID_FILTERS, MyFrame::OnFilters) #ifdef wxHAVE_RAW_BITMAP EVT_MENU (ID_SHOWRAW, MyFrame::OnTestRawBitmap) #endif @@ -750,6 +1024,9 @@ MyFrame::MyFrame() menuImage->Append( ID_SHOWTHUMBNAIL, "Test &thumbnail...\tCtrl-T", "Test scaling the image during load (try with JPEG)"); menuImage->AppendSeparator(); + menuImage->Append(ID_FILTERS, "Test image &filters...\tCtrl-F", + "Test applying different image filters"); + menuImage->AppendSeparator(); menuImage->Append( ID_ABOUT, "&About\tF1"); menuImage->AppendSeparator(); menuImage->Append( ID_QUIT, "E&xit\tCtrl-Q"); @@ -1088,6 +1365,11 @@ void MyFrame::OnThumbnail( wxCommandEvent &WXUNUSED(event) ) #endif // wxUSE_FILEDLG } +void MyFrame::OnFilters(wxCommandEvent& WXUNUSED(event)) +{ + (new MyFiltersFrame(this))->Show(); +} + //----------------------------------------------------------------------------- // MyApp //----------------------------------------------------------------------------- diff --git a/src/common/image.cpp b/src/common/image.cpp index 78fe5b82a3..7f234f4564 100644 --- a/src/common/image.cpp +++ b/src/common/image.cpp @@ -1827,119 +1827,89 @@ void wxImage::Replace( unsigned char r1, unsigned char g1, unsigned char b1, } } -wxImage wxImage::ConvertToGreyscale(void) const +wxImage wxImage::ConvertToGreyscale() const { return ConvertToGreyscale(0.299, 0.587, 0.114); } +// red, green and blue are doubles in the range [0.0..1.0], they are used +// internally by DoMakeGrey() only. +class WeightValue +{ +public: + WeightValue(double r = 0.0, double g = 0.0, double b = 0.0) + : red(r), green(g), blue(b) {} + double red; + double green; + double blue; +}; + +// TODO-C++11: Replace with a lambda function. +void DoMakeGrey(wxImage *image, unsigned char *rgb, WeightValue weight) +{ + if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || + rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) + wxColour::MakeGrey(rgb, rgb + 1, rgb + 2, weight.red, weight.green, weight.blue); +} + wxImage wxImage::ConvertToGreyscale(double weight_r, double weight_g, double weight_b) const { - wxImage image; - wxCHECK_MSG(IsOk(), image, "invalid image"); - - const int w = M_IMGDATA->m_width; - const int h = M_IMGDATA->m_height; - size_t size = size_t(w) * h; - image.Create(w, h, false); - const unsigned char* alpha = M_IMGDATA->m_alpha; - if (alpha) - { - image.SetAlpha(); - memcpy(image.GetAlpha(), alpha, size); - } - const unsigned char mask_r = M_IMGDATA->m_maskRed; - const unsigned char mask_g = M_IMGDATA->m_maskGreen; - const unsigned char mask_b = M_IMGDATA->m_maskBlue; - const bool hasMask = M_IMGDATA->m_hasMask; - if (hasMask) - image.SetMaskColour(mask_r, mask_g, mask_b); - - const unsigned char* src = M_IMGDATA->m_data; - unsigned char* dst = image.GetData(); - while (size--) - { - unsigned char r = *src++; - unsigned char g = *src++; - unsigned char b = *src++; - if (!hasMask || r != mask_r || g != mask_g || b != mask_b) - wxColour::MakeGrey(&r, &g, &b, weight_r, weight_g, weight_b); - *dst++ = r; - *dst++ = g; - *dst++ = b; - } + wxImage image = *this; + image.ApplyToAllPixels(&DoMakeGrey, WeightValue(weight_r, weight_g, weight_b)); return image; } -wxImage wxImage::ConvertToMono( unsigned char r, unsigned char g, unsigned char b ) const +// TODO-C++11: Replace with a lambda function. +void DoMakeMono(wxImage *WXUNUSED(image), unsigned char *rgb, wxImage::RGBValue rgbValue) { - wxImage image; + const bool on = (rgb[0] == rgbValue.red) && (rgb[1] == rgbValue.green) && (rgb[2] == rgbValue.blue); + wxColour::MakeMono(rgb, rgb + 1, rgb + 2, on); +} - wxCHECK_MSG( IsOk(), image, wxT("invalid image") ); +wxImage wxImage::ConvertToMono(unsigned char r, unsigned char g, unsigned char b) const +{ + wxImage image = *this; - image.Create( M_IMGDATA->m_width, M_IMGDATA->m_height, false ); - - unsigned char *data = image.GetData(); - - wxCHECK_MSG( data, image, wxT("unable to create image") ); - - if (M_IMGDATA->m_hasMask) + if ( image.HasMask() ) { - if (M_IMGDATA->m_maskRed == r && M_IMGDATA->m_maskGreen == g && - M_IMGDATA->m_maskBlue == b) - image.SetMaskColour( 255, 255, 255 ); + if ( image.GetMaskRed() == r && image.GetMaskGreen() == g && image.GetMaskBlue() == b) + image.SetMaskColour(255, 255, 255); else - image.SetMaskColour( 0, 0, 0 ); - } - - long size = M_IMGDATA->m_height * M_IMGDATA->m_width; - - unsigned char *srcd = M_IMGDATA->m_data; - unsigned char *tard = image.GetData(); - - for ( long i = 0; i < size; i++, srcd += 3, tard += 3 ) - { - bool on = (srcd[0] == r) && (srcd[1] == g) && (srcd[2] == b); - wxColourBase::MakeMono(tard + 0, tard + 1, tard + 2, on); + image.SetMaskColour(0, 0, 0); } + image.ApplyToAllPixels(&DoMakeMono, RGBValue(r, g, b)); return image; } +// TODO-C++11: Replace with a lambda function. +void DoMakeDisabled(wxImage *image, unsigned char *rgb, unsigned char brightness) +{ + if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || + rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) + wxColour::MakeDisabled(rgb, rgb + 1, rgb + 2, brightness); +} + wxImage wxImage::ConvertToDisabled(unsigned char brightness) const { - wxImage image; - wxCHECK_MSG(IsOk(), image, "invalid image"); + wxImage image = *this; + image.ApplyToAllPixels(&DoMakeDisabled, brightness); + return image; +} - const int w = M_IMGDATA->m_width; - const int h = M_IMGDATA->m_height; - size_t size = size_t(w) * h; - image.Create(w, h, false); - const unsigned char* alpha = M_IMGDATA->m_alpha; - if (alpha) - { - image.SetAlpha(); - memcpy(image.GetAlpha(), alpha, size); - } - const unsigned char mask_r = M_IMGDATA->m_maskRed; - const unsigned char mask_g = M_IMGDATA->m_maskGreen; - const unsigned char mask_b = M_IMGDATA->m_maskBlue; - const bool hasMask = M_IMGDATA->m_hasMask; - if (hasMask) - image.SetMaskColour(mask_r, mask_g, mask_b); +// TODO-C++11: Replace with a lambda function. +void DoChangeLightness(wxImage *image, unsigned char *rgb, int alpha) +{ + if ( !image->HasMask() || rgb[0] != image->GetMaskRed() || + rgb[1] != image->GetMaskGreen() || rgb[2] != image->GetMaskBlue() ) + wxColour::ChangeLightness(rgb, rgb + 1, rgb + 2, alpha); +} - const unsigned char* src = M_IMGDATA->m_data; - unsigned char* dst = image.GetData(); - while (size--) - { - unsigned char r = *src++; - unsigned char g = *src++; - unsigned char b = *src++; - if (!hasMask || r != mask_r || g != mask_g || b != mask_b) - wxColour::MakeDisabled(&r, &g, &b, brightness); - *dst++ = r; - *dst++ = g; - *dst++ = b; - } +wxImage wxImage::ChangeLightness(int alpha) const +{ + wxASSERT(alpha >= 0 && alpha <= 200); + wxImage image = *this; + image.ApplyToAllPixels(&DoChangeLightness, alpha); return image; } @@ -3323,45 +3293,126 @@ wxImage::RGBValue wxImage::HSVtoRGB(const HSVValue& hsv) (unsigned char)wxRound(blue * 255.0)); } -/* - * Rotates the hue of each pixel of the image. angle is a double in the range - * -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees - */ +// TODO-C++11: Replace with a lambda function. +void DoRotateHue(wxImage *WXUNUSED(image), unsigned char *rgb, double angle) +{ + wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); + wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); + + hsvValue.hue = hsvValue.hue + angle; + + if (hsvValue.hue > 1.0) + hsvValue.hue = hsvValue.hue - 1.0; + else if (hsvValue.hue < 0.0) + hsvValue.hue = hsvValue.hue + 1.0; + + rgbValue = wxImage::HSVtoRGB(hsvValue); + rgb[0] = rgbValue.red; + rgb[1] = rgbValue.green; + rgb[2] = rgbValue.blue; +} + +// Rotates the hue of each pixel in the image by angle, which is a double in the +// range [-1.0..+1.0], where -1.0 corresponds to -360 degrees and +1.0 corresponds +// to +360 degrees. void wxImage::RotateHue(double angle) { - AllocExclusive(); + if ( wxIsNullDouble(angle) ) + return; - unsigned long count; - wxImage::HSVValue hsv; - wxImage::RGBValue rgb; + wxASSERT(angle >= -1.0 && angle <= 1.0); + ApplyToAllPixels(&DoRotateHue, angle); +} - wxASSERT (angle >= -1.0 && angle <= 1.0); - count = M_IMGDATA->m_width * M_IMGDATA->m_height; - if ( count > 0 && !wxIsNullDouble(angle) ) - { - unsigned char* srcBytePtr; - unsigned char* dstBytePtr; - srcBytePtr = M_IMGDATA->m_data; - dstBytePtr = srcBytePtr; - do - { - rgb.red = *srcBytePtr++; - rgb.green = *srcBytePtr++; - rgb.blue = *srcBytePtr++; - hsv = RGBtoHSV(rgb); +// TODO-C++11: Replace with a lambda function. +void DoChangeSaturation(wxImage *WXUNUSED(image), unsigned char *rgb, double factor) +{ + wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); + wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); - hsv.hue = hsv.hue + angle; - if (hsv.hue > 1.0) - hsv.hue = hsv.hue - 1.0; - else if (hsv.hue < 0.0) - hsv.hue = hsv.hue + 1.0; + hsvValue.saturation += hsvValue.saturation * factor; - rgb = HSVtoRGB(hsv); - *dstBytePtr++ = rgb.red; - *dstBytePtr++ = rgb.green; - *dstBytePtr++ = rgb.blue; - } while (--count != 0); - } + if (hsvValue.saturation > 1.0) + hsvValue.saturation = 1.0; + else if (hsvValue.saturation < 0.0) + hsvValue.saturation = 0.0; + + rgbValue = wxImage::HSVtoRGB(hsvValue); + rgb[0] = rgbValue.red; + rgb[1] = rgbValue.green; + rgb[2] = rgbValue.blue; +} + +// Changes the saturation of each pixel in the image. factor is a double in the +// range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 corresponds +// to +100 percent. +void wxImage::ChangeSaturation(double factor) +{ + if ( wxIsNullDouble(factor) ) + return; + + wxASSERT(factor >= -1.0 && factor <= 1.0); + ApplyToAllPixels(&DoChangeSaturation, factor); +} + +// TODO-C++11: Replace with a lambda function. +void DoChangeBrightness(wxImage *WXUNUSED(image), unsigned char *rgb, double factor) +{ + wxImage::RGBValue rgbValue(rgb[0], rgb[1], rgb[2]); + wxImage::HSVValue hsvValue = wxImage::RGBtoHSV(rgbValue); + + hsvValue.value += hsvValue.value * factor; + + if (hsvValue.value > 1.0) + hsvValue.value = 1.0; + else if (hsvValue.value < 0.0) + hsvValue.value = 0.0; + + rgbValue = wxImage::HSVtoRGB(hsvValue); + rgb[0] = rgbValue.red; + rgb[1] = rgbValue.green; + rgb[2] = rgbValue.blue; +} + +// Changes the brightness (value) of each pixel in the image. factor is a double +// in the range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 +// corresponds to +100 percent. +void wxImage::ChangeBrightness(double factor) +{ + if ( wxIsNullDouble(factor) ) + return; + + wxASSERT(factor >= -1.0 && factor <= 1.0); + ApplyToAllPixels(&DoChangeBrightness, factor); +} + +// TODO-C++11: Replace with a lambda function. +void DoChangeHSV(wxImage *image, unsigned char *rgb, wxImage::HSVValue hsvValue) +{ + if ( !wxIsNullDouble(hsvValue.hue) ) + DoRotateHue(image, rgb, hsvValue.hue); + + if ( !wxIsNullDouble(hsvValue.saturation) ) + DoChangeSaturation(image, rgb, hsvValue.saturation); + + if ( !wxIsNullDouble(hsvValue.value) ) + DoChangeBrightness(image, rgb, hsvValue.value); +} + +// Changes the hue, the saturation and the brightness (value) of each pixel in +// the image. angleH is a double in the range [-1.0..+1.0], where -1.0 corresponds +// to -360 degrees and +1.0 corresponds to +360 degrees, factorS is a double in +// the range [-1.0..+1.0], where -1.0 corresponds to -100 percent and +1.0 +// corresponds to +100 percent and factorV is a double in the range [-1.0..+1.0], +// where -1.0 corresponds to -100 percent and +1.0 corresponds to +100 percent. +void wxImage::ChangeHSV(double angleH, double factorS, double factorV) +{ + if ( wxIsNullDouble(angleH) && wxIsNullDouble(factorS) && wxIsNullDouble(factorV) ) + return; + + wxASSERT(angleH >= -1.0 && angleH <= 1.0 && factorS >= -1.0 && + factorS <= 1.0 && factorV >= -1.0 && factorV <= 1.0); + ApplyToAllPixels(&DoChangeHSV, HSVValue(angleH, factorS, factorV)); } //----------------------------------------------------------------------------- @@ -3857,9 +3908,20 @@ wxImage wxImage::Rotate(double angle, return rotated; } +// Helper function used internally by wxImage class only. +template +void wxImage::ApplyToAllPixels(void (*filter)(wxImage *, unsigned char *, T), T value) +{ + AllocExclusive(); + const size_t size = GetWidth() * GetHeight(); + unsigned char *data = GetData(); - + for ( size_t i = 0; i < size; i++, data += 3 ) + { + (*filter)(this, data, value); + } +} // A module to allow wxImage initialization/cleanup // without calling these functions from app.cpp or from diff --git a/tests/Makefile.in b/tests/Makefile.in index 48bebb8a78..07decd53f6 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -554,7 +554,7 @@ data: data-images: @mkdir -p image - @for f in horse_grey.bmp horse_grey_flipped.bmp horse_rle4.bmp horse_rle4_flipped.bmp horse_rle8.bmp horse_rle8_flipped.bmp horse_bicubic_50x50.png horse_bicubic_100x100.png horse_bicubic_150x150.png horse_bicubic_300x300.png horse_bilinear_50x50.png horse_bilinear_100x100.png horse_bilinear_150x150.png horse_bilinear_300x300.png horse_box_average_50x50.png horse_box_average_100x100.png horse_box_average_150x150.png horse_box_average_300x300.png cross_bicubic_256x256.png cross_bilinear_256x256.png cross_box_average_256x256.png cross_nearest_neighb_256x256.png paste_input_background.png paste_input_black.png paste_input_overlay_transparent_border_opaque_square.png paste_input_overlay_transparent_border_semitransparent_circle.png paste_input_overlay_transparent_border_semitransparent_square.png paste_result_background_plus_circle_plus_square.png paste_result_background_plus_overlay_transparent_border_opaque_square.png paste_result_background_plus_overlay_transparent_border_semitransparent_square.png paste_result_no_background_square_over_circle.png wx.png wx.ico; do \ + @for f in horse_grey.bmp horse_grey_flipped.bmp horse_rle4.bmp horse_rle4_flipped.bmp horse_rle8.bmp horse_rle8_flipped.bmp horse_bicubic_50x50.png horse_bicubic_100x100.png horse_bicubic_150x150.png horse_bicubic_300x300.png horse_bilinear_50x50.png horse_bilinear_100x100.png horse_bilinear_150x150.png horse_bilinear_300x300.png horse_box_average_50x50.png horse_box_average_100x100.png horse_box_average_150x150.png horse_box_average_300x300.png cross_bicubic_256x256.png cross_bilinear_256x256.png cross_box_average_256x256.png cross_nearest_neighb_256x256.png paste_input_background.png paste_input_black.png paste_input_overlay_transparent_border_opaque_square.png paste_input_overlay_transparent_border_semitransparent_circle.png paste_input_overlay_transparent_border_semitransparent_square.png paste_result_background_plus_circle_plus_square.png paste_result_background_plus_overlay_transparent_border_opaque_square.png paste_result_background_plus_overlay_transparent_border_semitransparent_square.png paste_result_no_background_square_over_circle.png wx.png wx.ico toucan.png toucan_hue_0.538.png toucan_sat_-0.41.png toucan_bright_-0.259.png toucan_hsv_0.538_-0.41_-0.259.png toucan_light_46.png toucan_dis_240.png toucan_grey.png toucan_mono_255_255_255.png; do \ if test ! -f image/$$f -a ! -d image/$$f ; \ then x=yep ; \ else x=`find $(srcdir)/image/$$f -newer image/$$f -print` ; \ diff --git a/tests/image/image.cpp b/tests/image/image.cpp index af70bc21ee..d75ee42caa 100644 --- a/tests/image/image.cpp +++ b/tests/image/image.cpp @@ -2200,6 +2200,55 @@ TEST_CASE("wxImage::XPM", "[image][xpm]") CHECK( wxIcon(dummy_xpm).IsOk() ); } +TEST_CASE("wxImage::ChangeColours", "[image]") +{ + wxImage original; + REQUIRE(original.LoadFile("image/toucan.png", wxBITMAP_TYPE_PNG)); + + wxImage test; + wxImage expected; + + test = original; + test.RotateHue(0.538); + REQUIRE(expected.LoadFile("image/toucan_hue_0.538.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test.ChangeSaturation(-0.41); + REQUIRE(expected.LoadFile("image/toucan_sat_-0.41.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test.ChangeBrightness(-0.259); + REQUIRE(expected.LoadFile("image/toucan_bright_-0.259.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test.ChangeHSV(0.538, -0.41, -0.259); + REQUIRE(expected.LoadFile("image/toucan_hsv_0.538_-0.41_-0.259.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test = test.ChangeLightness(46); + REQUIRE(expected.LoadFile("image/toucan_light_46.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test = test.ConvertToDisabled(240); + REQUIRE(expected.LoadFile("image/toucan_dis_240.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test = test.ConvertToGreyscale(); + REQUIRE(expected.LoadFile("image/toucan_grey.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); + + test = original; + test = test.ConvertToMono(255, 255, 255); + REQUIRE(expected.LoadFile("image/toucan_mono_255_255_255.png", wxBITMAP_TYPE_PNG)); + CHECK_THAT(test, RGBSameAs(expected)); +} + /* TODO: add lots of more tests to wxImage functions */ diff --git a/tests/image/toucan.png b/tests/image/toucan.png new file mode 100644 index 0000000000000000000000000000000000000000..03960d4939938541ca3f8efee4bf13ffdecbb2f5 GIT binary patch literal 12901 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%0AheHzViFFTkccT#hIw`D-d{z{gz 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 Xb{aU8yD5L%bcB!+lLuFc==uLIPEgs8 literal 0 HcmV?d00001 diff --git a/tests/image/toucan_hue_0.538.png b/tests/image/toucan_hue_0.538.png new file mode 100644 index 0000000000000000000000000000000000000000..2a559d3bd4c0906830915ace02667d4cada3b1e9 GIT binary patch literal 11349 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 ZH9m2kUX2{q$0i>@N=zP9BVri%e*iyQPI3SM literal 0 HcmV?d00001 diff --git a/tests/image/toucan_mono_255_255_255.png b/tests/image/toucan_mono_255_255_255.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc3078958696daa7fb1e7084d62cf751fac0368 GIT binary patch literal 6072 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 literal 0 HcmV?d00001 diff --git a/tests/image/toucan_sat_-0.41.png b/tests/image/toucan_sat_-0.41.png new file mode 100644 index 0000000000000000000000000000000000000000..8c89c7c065953c3a21a79c4511421490080d7e50 GIT binary patch literal 11293 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 TKd$dTyE3K4<;AK+3