1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: SWIG definitions for wxImage and such
7 // Created: 25-Sept-2000
9 // Copyright: (c) 2003 by Total Control Software
10 // Licence: wxWindows license
11 /////////////////////////////////////////////////////////////////////////////
16 //---------------------------------------------------------------------------
19 #include "wx/wxPython/pyistream.h"
22 //---------------------------------------------------------------------------
25 wxIMAGE_ALPHA_TRANSPARENT,
26 wxIMAGE_ALPHA_THRESHOLD,
31 //---------------------------------------------------------------------------
34 DocStr(wxImageHandler,
35 "This is the base class for implementing image file loading/saving, and
36 image creation from data. It is used within `wx.Image` and is not
37 normally seen by the application.", "");
38 class wxImageHandler : public wxObject {
40 // wxImageHandler(); Abstract Base Class
42 wxString GetExtension();
44 wxString GetMimeType();
46 //bool LoadFile(wxImage* image, wxInputStream& stream);
47 //bool SaveFile(wxImage* image, wxOutputStream& stream);
48 //virtual int GetImageCount( wxInputStream& stream );
49 //bool CanRead( wxInputStream& stream );
51 bool CanRead( const wxString& name );
53 void SetName(const wxString& name);
54 void SetExtension(const wxString& extension);
55 void SetType(long type);
56 void SetMimeType(const wxString& mimetype);
60 //---------------------------------------------------------------------------
63 DocStr(wxPyImageHandler,
64 "This is the base class for implementing image file loading/saving, and
65 image creation from data, all written in Python. To create a custom
66 image handler derive a new class from wx.PyImageHandler and provide
67 the following methods::
69 def DoCanRead(self, stream) --> bool
70 '''Check if this handler can read the image on the stream'''
72 def LoadFile(self, image, stream, verbose, index) --> bool
73 '''Load image data from the stream and load it into image.'''
75 def SaveFile(self, image, stream, verbose) --> bool
76 '''Save the iamge data in image to the stream using
77 this handler's image file format.'''
79 def GetImageCount(self, stream) --> int
80 '''If this image format can hold more than one image,
81 how many does the image on the stream have?'''
83 To activate your handler create an instance of it and pass it to
84 `wx.Image_AddHandler`. Be sure to call `SetName`, `SetType`, and
85 `SetExtension` from your constructor.
88 class wxPyImageHandler: public wxImageHandler {
90 %pythonAppend wxPyImageHandler() "self._SetSelf(self)"
92 void _SetSelf(PyObject *self);
96 //---------------------------------------------------------------------------
99 class wxImageHistogram /* : public wxImageHistogramBase */
104 DocStr(MakeKey, "Get the key in the histogram for the given RGB values", "");
105 static unsigned long MakeKey(byte r,
110 bool, FindFirstUnusedColour(byte *OUTPUT,
115 byte startB = 0 ) const,
116 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
117 "Find first colour that is not used in the image and has higher RGB
118 values than startR, startG, startB. Returns a tuple consisting of a
119 success flag and rgb values.", "");
123 "Returns the pixel count for the given key. Use `MakeKey` to create a
124 key value from a RGB tripple.", "");
125 unsigned long GetCount(unsigned long key) {
126 wxImageHistogramEntry e = (*self)[key];
131 "Returns the pixel count for the given RGB values.", "");
132 unsigned long GetCountRGB(byte r,
135 unsigned long key = wxImageHistogram::MakeKey(r, g, b);
136 wxImageHistogramEntry e = (*self)[key];
140 DocStr(GetCountColour,
141 "Returns the pixel count for the given `wx.Colour` value.", "");
142 unsigned long GetCountColour(const wxColour& colour) {
143 unsigned long key = wxImageHistogram::MakeKey(colour.Red(),
146 wxImageHistogramEntry e = (*self)[key];
154 //---------------------------------------------------------------------------
157 typedef unsigned char* buffer;
160 %typemap(in) (buffer data, int DATASIZE)
161 { if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
163 %typemap(in) (buffer alpha, int ALPHASIZE)
164 { if (!PyArg_Parse($input, "t#", &$1, &$2)) SWIG_fail; }
166 //---------------------------------------------------------------------------
170 "A platform-independent image class. An image can be created from
171 data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a
172 variety of formats. Functions are available to set and get image
173 bits, so it can be used for basic image manipulation.
175 A wx.Image cannot be drawn directly to a `wx.DC`. Instead, a
176 platform-specific `wx.Bitmap` object must be created from it using the
177 `wx.BitmapFromImage` constructor. This bitmap can then be drawn in a
178 device context, using `wx.DC.DrawBitmap`.
180 One colour value of the image may be used as a mask colour which will
181 lead to the automatic creation of a `wx.Mask` object associated to the
184 wx.Image supports alpha channel data, that is in addition to a byte
185 for the red, green and blue colour components for each pixel it also
186 stores a byte representing the pixel opacity. An alpha value of 0
187 corresponds to a transparent pixel (null opacity) while a value of 255
188 means that the pixel is 100% opaque.
190 Unlike RGB data, not all images have an alpha channel and before using
191 `GetAlpha` you should check if this image contains an alpha channel
192 with `HasAlpha`. Note that currently only images loaded from PNG files
193 with transparency information will have an alpha channel.", "");
197 // Pull the nested class out to the top level for SWIG's sake
198 #define wxImage_RGBValue wxImage::RGBValue
199 #define wxImage_HSVValue wxImage::HSVValue
202 DocStr(wxImage_RGBValue,
203 "An object that contains values for red, green and blue which represent
204 the value of a color. It is used by `wx.Image.HSVtoRGB` and
205 `wx.Image.RGBtoHSV`, which converts between HSV color space and RGB
207 class wxImage_RGBValue
211 wxImage_RGBValue(byte r=0, byte g=0, byte b=0),
219 DocStr(wxImage_HSVValue,
220 "An object that contains values for hue, saturation and value which
221 represent the value of a color. It is used by `wx.Image.HSVtoRGB` and
222 `wx.Image.RGBtoHSV`, which +converts between HSV color space and RGB
224 class wxImage_HSVValue
228 wxImage_HSVValue(double h=0.0, double s=0.0, double v=0.0),
236 class wxImage : public wxObject {
238 %typemap(out) wxImage*; // turn off this typemap
241 wxImage( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
242 "Loads an image from a file.",
244 :param name: Name of the file from which to load the image.
246 :param type: May be one of the following:
248 ==================== =======================================
249 wx.BITMAP_TYPE_BMP Load a Windows bitmap file.
250 wx.BITMAP_TYPE_GIF Load a GIF bitmap file.
251 wx.BITMAP_TYPE_JPEG Load a JPEG bitmap file.
252 wx.BITMAP_TYPE_PNG Load a PNG bitmap file.
253 wx.BITMAP_TYPE_PCX Load a PCX bitmap file.
254 wx.BITMAP_TYPE_PNM Load a PNM bitmap file.
255 wx.BITMAP_TYPE_TIF Load a TIFF bitmap file.
256 wx.BITMAP_TYPE_XPM Load a XPM bitmap file.
257 wx.BITMAP_TYPE_ICO Load a Windows icon file (ICO).
258 wx.BITMAP_TYPE_CUR Load a Windows cursor file (CUR).
259 wx.BITMAP_TYPE_ANI Load a Windows animated cursor file (ANI).
260 wx.BITMAP_TYPE_ANY Will try to autodetect the format.
261 ==================== =======================================
263 :param index: Index of the image to load in the case that the
264 image file contains multiple images. This is only used by GIF,
265 ICO and TIFF handlers. The default value (-1) means to choose
266 the default image and is interpreted as the first image (the
267 one with index=0) by the GIF and TIFF handler and as the
268 largest and most colourful one by the ICO handler.
270 :see: `wx.ImageFromMime`, `wx.ImageFromStream`, `wx.ImageFromStreamMime`,
271 `wx.EmptyImage`, `wx.ImageFromBitmap`, `wx.ImageFromData`,
272 `wx.ImageFromDataWithAlpha`
277 // Alternate constructors
279 wxImage(const wxString& name, const wxString& mimetype, int index = -1),
280 "Loads an image from a file, using a MIME type string (such as
281 'image/jpeg') to specify image type.", "
287 wxImage(wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1),
288 "Loads an image from an input stream, or any readable Python file-like
295 wxImage(wxInputStream& stream, const wxString& mimetype, int index = -1 ),
296 "Loads an image from an input stream, or any readable Python file-like
297 object, specifying the image format with a MIME type string.", "
300 ImageFromStreamMime);
305 "Construct an empty image of a given size, optionally setting all
309 wxImage(int width=0, int height=0, bool clear = true))
311 if (width > 0 && height > 0)
312 return new wxImage(width, height, clear);
318 MustHaveApp(wxImage(const wxBitmap &bitmap));
322 "Construct an Image from a `wx.Bitmap`.", "
325 wxImage(const wxBitmap &bitmap))
327 return new wxImage(bitmap.ConvertToImage());
332 "Construct an Image from a buffer of RGB bytes. Accepts either a
333 string or a buffer object holding the data and the length of the data
334 must be width*height*3.", "
337 wxImage(int width, int height, buffer data, int DATASIZE))
339 if (DATASIZE != width*height*3) {
340 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
344 // Copy the source data so the wxImage can clean it up later
345 buffer copy = (buffer)malloc(DATASIZE);
347 wxPyBLOCK_THREADS(PyErr_NoMemory());
350 memcpy(copy, data, DATASIZE);
351 return new wxImage(width, height, copy, false);
356 ImageFromDataWithAlpha,
357 "Construct an Image from a buffer of RGB bytes with an Alpha channel.
358 Accepts either a string or a buffer object holding the data and the
359 length of the data must be width*height*3 bytes, and the length of the
360 alpha data must be width*height bytes.", "
363 wxImage(int width, int height, buffer data, int DATASIZE, buffer alpha, int ALPHASIZE))
365 if (DATASIZE != width*height*3) {
366 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
369 if (ALPHASIZE != width*height) {
370 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
374 // Copy the source data so the wxImage can clean it up later
375 buffer dcopy = (buffer)malloc(DATASIZE);
377 wxPyBLOCK_THREADS(PyErr_NoMemory());
380 memcpy(dcopy, data, DATASIZE);
382 buffer acopy = (buffer)malloc(ALPHASIZE);
384 wxPyBLOCK_THREADS(PyErr_NoMemory());
387 memcpy(acopy, alpha, ALPHASIZE);
389 return new wxImage(width, height, dcopy, acopy, false);
393 // TODO: wxImage( char** xpmData );
395 // Turn it back on again
396 %typemap(out) wxImage* { $result = wxPyMake_wxObject($1, $owner); }
400 void , Create( int width, int height, bool clear=true ),
401 "Creates a fresh image. If clear is ``True``, the new image will be
402 initialized to black. Otherwise, the image data will be uninitialized.", "");
406 "Destroys the image data.", "");
410 wxImage , Scale( int width, int height ),
411 "Returns a scaled version of the image. This is also useful for scaling
412 bitmaps in general as the only other way to scale bitmaps is to blit a
413 `wx.MemoryDC` into another `wx.MemoryDC`.", "
418 wxImage , ShrinkBy( int xFactor , int yFactor ) const ,
419 "Return a version of the image scaled smaller by the given factors.", "");
422 wxImage& , Rescale(int width, int height),
423 "Changes the size of the image in-place by scaling it: after a call to
424 this function, the image will have the given width and height.
426 Returns the (modified) image itself.", "
431 // resizes the image in place
433 wxImage& , Resize( const wxSize& size, const wxPoint& pos,
434 int r = -1, int g = -1, int b = -1 ),
435 "Changes the size of the image in-place without scaling it, by adding
436 either a border with the given colour or cropping as necessary. The
437 image is pasted into a new image with the given size and background
438 colour at the position pos relative to the upper left of the new
439 image. If red = green = blue = -1 then use either the current mask
440 colour if set or find, use, and set a suitable mask colour for any
443 Returns the (modified) image itself.", "
449 void , SetRGB( int x, int y, byte r, byte g, byte b ),
450 "Sets the pixel at the given coordinate. This routine performs
451 bounds-checks for the coordinate so it can be considered a safe way to
452 manipulate the data, but in some cases this might be too slow so that
453 the data will have to be set directly. In that case you will have to
454 get access to the image data using the `GetData` method.", "");
458 void, SetRGB( const wxRect& rect,
459 byte r, byte g, byte b ),
460 "Sets the colour of the pixels within the given rectangle. This routine
461 performs bounds-checks for the rectangle so it can be considered a
462 safe way to manipulate the data.", "",
466 byte , GetRed( int x, int y ),
467 "Returns the red intensity at the given coordinate.", "");
470 byte , GetGreen( int x, int y ),
471 "Returns the green intensity at the given coordinate.", "");
474 byte , GetBlue( int x, int y ),
475 "Returns the blue intensity at the given coordinate.", "");
479 void , SetAlpha(int x, int y, byte alpha),
480 "Sets the alpha value for the given pixel. This function should only be
481 called if the image has alpha channel data, use `HasAlpha` to check
485 byte , GetAlpha(int x, int y),
486 "Returns the alpha value for the given pixel. This function may only be
487 called for the images with alpha channel, use `HasAlpha` to check for
490 The returned value is the *opacity* of the image, i.e. the value of 0
491 corresponds to the fully transparent pixels while the value of 255 to
492 the fully opaque pixels.", "");
496 "Returns true if this image has alpha channel, false otherwise.", "
498 :see: `GetAlpha`, `SetAlpha`");
503 "Initializes the image alpha channel data. It is an error to call it if
504 the image already has alpha data. If it doesn't, alpha data will be by
505 default initialized to all pixels being fully opaque. But if the image
506 has a a mask colour, all mask pixels will be completely transparent.", "");
510 bool , IsTransparent(int x, int y,
511 byte threshold = wxIMAGE_ALPHA_THRESHOLD) const,
512 "Returns ``True`` if this pixel is masked or has an alpha value less
513 than the spcified threshold.", "");
516 // find first colour that is not used in the image and has higher
517 // RGB values than <startR,startG,startB>
519 bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT,
520 byte startR = 0, byte startG = 0, byte startB = 0 ) const,
521 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
522 "Find first colour that is not used in the image and has higher RGB
523 values than startR, startG, startB. Returns a tuple consisting of a
524 success flag and rgb values.", "");
528 bool , ConvertAlphaToMask(byte threshold = wxIMAGE_ALPHA_THRESHOLD),
529 "If the image has alpha channel, this method converts it to mask. All
530 pixels with alpha value less than ``threshold`` are replaced with the
531 mask colour and the alpha channel is removed. The mask colour is
532 chosen automatically using `FindFirstUnusedColour`.
534 If the image image doesn't have alpha channel, ConvertAlphaToMask does
539 bool , ConvertColourToAlpha( byte r, byte g, byte b ),
540 "This method converts an image where the original alpha information is
541 only available as a shades of a colour (actually shades of grey)
542 typically when you draw anti-aliased text into a bitmap. The DC
543 drawing routines draw grey values on the black background although
544 they actually mean to draw white with differnt alpha values. This
545 method reverses it, assuming a black (!) background and white text.
546 The method will then fill up the whole image with the colour given.", "");
551 bool , SetMaskFromImage(const wxImage & mask,
552 byte mr, byte mg, byte mb),
553 "Sets the image's mask so that the pixels that have RGB value of
554 ``(mr,mg,mb)`` in ``mask`` will be masked in this image. This is done
555 by first finding an unused colour in the image, setting this colour as
556 the mask colour and then using this colour to draw all pixels in the
557 image who corresponding pixel in mask has given RGB value.
559 Returns ``False`` if ``mask`` does not have same dimensions as the
560 image or if there is no unused colour left. Returns ``True`` if the
561 mask was successfully applied.
563 Note that this method involves computing the histogram, which is
564 computationally intensive operation.", "");
567 // void DoFloodFill (wxCoord x, wxCoord y,
568 // const wxBrush & fillBrush,
569 // const wxColour& testColour,
570 // int style = wxFLOOD_SURFACE,
571 // int LogicalFunction = wxCOPY /* currently unused */ ) ;
574 static bool , CanRead( const wxString& filename ),
575 "Returns True if the image handlers can read this file.", "");
578 static int , GetImageCount( const wxString& filename, long type = wxBITMAP_TYPE_ANY ),
579 "If the image file contains more than one image and the image handler
580 is capable of retrieving these individually, this function will return
581 the number of available images.", "");
585 bool , LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
586 "Loads an image from a file. If no handler type is provided, the
587 library will try to autodetect the format.", "");
590 bool , LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ),
591 "Loads an image from a file, specifying the image type with a MIME type
597 bool , SaveFile( const wxString& name, int type ),
598 "Saves an image in the named file.", "");
602 bool , SaveFile( const wxString& name, const wxString& mimetype ),
603 "Saves an image in the named file.", "",
608 static bool , CanRead( wxInputStream& stream ),
609 "Returns True if the image handlers can read an image file from the
610 data currently on the input stream, or a readable Python file-like
616 bool , LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
617 "Loads an image from an input stream or a readable Python file-like
618 object. If no handler type is provided, the library will try to
619 autodetect the format.", "",
624 bool , LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ),
625 "Loads an image from an input stream or a readable Python file-like
626 object, using a MIME type string to specify the image file format.", "",
632 "Returns true if image data is present.", "");
636 "Gets the width of the image in pixels.", "");
640 "Gets the height of the image in pixels.", "");
645 "Returns the size of the image in pixels.", "");
647 wxSize size(self->GetWidth(), self->GetHeight());
654 wxImage , GetSubImage(const wxRect& rect),
655 "Returns a sub image of the current one as long as the rect belongs
656 entirely to the image.", "");
660 wxImage , Size( const wxSize& size, const wxPoint& pos,
661 int r = -1, int g = -1, int b = -1 ) const,
662 "Returns a resized version of this image without scaling it by adding
663 either a border with the given colour or cropping as necessary. The
664 image is pasted into a new image with the given size and background
665 colour at the position ``pos`` relative to the upper left of the new
666 image. If red = green = blue = -1 then use either the current mask
667 colour if set or find, use, and set a suitable mask colour for any
668 newly exposed areas.", "
675 "Returns an identical copy of the image.", "");
678 void , Paste( const wxImage &image, int x, int y ),
679 "Pastes ``image`` into this instance and takes care of the mask colour
680 and any out of bounds problems.", "");
683 //unsigned char *GetData();
684 //void SetData( unsigned char *data );
688 "Returns a string containing a copy of the RGB bytes of the image.", "");
691 buffer data = self->GetData();
692 int len = self->GetWidth() * self->GetHeight() * 3;
694 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len));
698 "Resets the Image's RGB data from a buffer of RGB bytes. Accepts
699 either a string or a buffer object holding the data and the length of
700 the data must be width*height*3.", "");
701 void SetData(buffer data, int DATASIZE)
703 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
704 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
707 buffer copy = (buffer)malloc(DATASIZE);
709 wxPyBLOCK_THREADS(PyErr_NoMemory());
712 memcpy(copy, data, DATASIZE);
713 self->SetData(copy, false);
714 // wxImage takes ownership of copy...
718 DocStr(GetDataBuffer,
719 "Returns a writable Python buffer object that is pointing at the RGB
720 image data buffer inside the wx.Image. You need to ensure that you do
721 not use this buffer object after the image has been destroyed.", "");
722 PyObject* GetDataBuffer()
724 buffer data = self->GetData();
725 int len = self->GetWidth() * self->GetHeight() * 3;
727 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
731 DocStr(SetDataBuffer,
732 "Sets the internal image data pointer to point at a Python buffer
733 object. This can save making an extra copy of the data but you must
734 ensure that the buffer object lives longer than the wx.Image does.", "");
735 void SetDataBuffer(buffer data, int DATASIZE)
737 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
738 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
741 self->SetData(data, true);
747 "Returns a string containing a copy of the alpha bytes of the image.", "");
748 PyObject* GetAlphaData() {
749 buffer data = self->GetAlpha();
753 int len = self->GetWidth() * self->GetHeight();
755 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len) );
761 "Resets the Image's alpha data from a buffer of bytes. Accepts either
762 a string or a buffer object holding the data and the length of the
763 data must be width*height.", "");
764 void SetAlphaData(buffer alpha, int ALPHASIZE)
766 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
767 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
770 buffer acopy = (buffer)malloc(ALPHASIZE);
772 wxPyBLOCK_THREADS(PyErr_NoMemory());
775 memcpy(acopy, alpha, ALPHASIZE);
776 self->SetAlpha(acopy, false);
777 // wxImage takes ownership of acopy...
782 DocStr(GetDataBuffer,
783 "Returns a writable Python buffer object that is pointing at the Alpha
784 data buffer inside the wx.Image. You need to ensure that you do not
785 use this buffer object after the image has been destroyed.", "");
786 PyObject* GetAlphaBuffer()
788 buffer data = self->GetAlpha();
789 int len = self->GetWidth() * self->GetHeight();
791 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
796 DocStr(SetDataBuffer,
797 "Sets the internal image alpha pointer to point at a Python buffer
798 object. This can save making an extra copy of the data but you must
799 ensure that the buffer object lives as long as the wx.Image does.", "");
800 void SetAlphaBuffer(buffer alpha, int ALPHASIZE)
802 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
803 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
806 self->SetAlpha(alpha, true);
813 void , SetMaskColour( byte r, byte g, byte b ),
814 "Sets the mask colour for this image (and tells the image to use the
819 /*bool*/ void , GetOrFindMaskColour( byte *OUTPUT,
821 byte *OUTPUT ) const,
822 "GetOrFindMaskColour() -> (r,g,b)",
823 "Get the current mask colour or find a suitable colour.", "");
828 "Gets the red component of the mask colour.", "");
831 byte , GetMaskGreen(),
832 "Gets the green component of the mask colour.", "");
835 byte , GetMaskBlue(),
836 "Gets the blue component of the mask colour.", "");
839 void , SetMask( bool mask = true ),
840 "Specifies whether there is a mask or not. The area of the mask is
841 determined by the current mask colour.", "");
845 "Returns ``True`` if there is a mask active, ``False`` otherwise.", "");
849 wxImage , Rotate(double angle, const wxPoint & centre_of_rotation,
850 bool interpolating = true, wxPoint * offset_after_rotation = NULL) const ,
851 "Rotates the image about the given point, by ``angle`` radians. Passing
852 ``True`` to ``interpolating`` results in better image quality, but is
853 slower. If the image has a mask, then the mask colour is used for the
854 uncovered pixels in the rotated image background. Otherwise, black
855 will be used as the fill colour.
857 Returns the rotated image, leaving this image intact.", "");
860 wxImage , Rotate90( bool clockwise = true ) ,
861 "Returns a copy of the image rotated 90 degrees in the direction
862 indicated by ``clockwise``.", "");
865 wxImage , Mirror( bool horizontally = true ) ,
866 "Returns a mirrored copy of the image. The parameter ``horizontally``
867 indicates the orientation.", "");
871 void , Replace( byte r1, byte g1, byte b1,
872 byte r2, byte g2, byte b2 ),
873 "Replaces the colour specified by ``(r1,g1,b1)`` by the colour
874 ``(r2,g2,b2)``.", "");
877 wxImage , ConvertToGreyscale( double lr = 0.299,
879 double lb = 0.114 ) const,
880 "Convert to greyscale image. Uses the luminance component (Y) of the
881 image. The luma value (YUV) is calculated using (R * lr) + (G * lg) + (B * lb),
882 defaults to ITU-T BT.601", "");
886 wxImage , ConvertToMono( byte r, byte g, byte b ) const,
887 "Returns monochromatic version of the image. The returned image has
888 white colour where the original has ``(r,g,b)`` colour and black
889 colour everywhere else.", "");
893 void , SetOption(const wxString& name, const wxString& value),
894 "Sets an image handler defined option. For example, when saving as a
895 JPEG file, the option ``wx.IMAGE_OPTION_QUALITY`` is used, which is a
896 number between 0 and 100 (0 is terrible, 100 is very good).", "
898 ================================= ===
899 wx.IMAGE_OPTION_BMP_FORMAT
900 wx.IMAGE_OPTION_CUR_HOTSPOT_X
901 wx.IMAGE_OPTION_CUR_HOTSPOT_Y
902 wx.IMAGE_OPTION_RESOLUTION
903 wx.IMAGE_OPTION_RESOLUTIONX
904 wx.IMAGE_OPTION_RESOLUTIONY
905 wx.IMAGE_OPTION_RESOLUTIONUNIT
906 wx.IMAGE_OPTION_QUALITY
907 wx.IMAGE_OPTION_BITSPERSAMPLE
908 wx.IMAGE_OPTION_SAMPLESPERPIXEL
909 wx.IMAGE_OPTION_COMPRESSION
910 wx.IMAGE_OPTION_IMAGEDESCRIPTOR
911 wx.IMAGE_OPTION_PNG_FORMAT
912 wx.IMAGE_OPTION_PNG_BITDEPTH
913 ================================= ===
915 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOptionInt`");
918 void, SetOption(const wxString& name, int value),
919 "Sets an image option as an integer.", "
921 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOption`",
925 wxString , GetOption(const wxString& name) const,
926 "Gets the value of an image handler option.", "
928 :see: `HasOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
931 int , GetOptionInt(const wxString& name) const,
932 "Gets the value of an image handler option as an integer. If the given
933 option is not present, the function returns 0.", "
935 :see: `HasOption`, `GetOption`, `SetOptionInt`, `SetOption`");
938 bool , HasOption(const wxString& name) const,
939 "Returns true if the given option is present.", "
941 :see: `GetOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
944 unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 );
945 unsigned long ComputeHistogram( wxImageHistogram& h );
947 static void AddHandler( wxImageHandler *handler );
948 static void InsertHandler( wxImageHandler *handler );
949 static bool RemoveHandler( const wxString& name );
951 static PyObject* GetHandlers() {
952 wxList& list = wxImage::GetHandlers();
953 return wxPy_ConvertList(&list);
958 static wxString , GetImageExtWildcard(),
959 "Iterates all registered wxImageHandler objects, and returns a string
960 containing file extension masks suitable for passing to file open/save
965 MustHaveApp(ConvertToBitmap);
966 MustHaveApp(ConvertToMonoBitmap);
969 wxBitmap ConvertToBitmap(int depth=-1) {
970 wxBitmap bitmap(*self, depth);
974 wxBitmap ConvertToMonoBitmap( byte red,
977 wxImage mono = self->ConvertToMono( red, green, blue );
978 wxBitmap bitmap( mono, 1 );
985 void , RotateHue(double angle),
986 "Rotates the hue of each pixel of the image. Hue is a double in the
987 range -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees", "");
990 static wxImage_HSVValue , RGBtoHSV(wxImage_RGBValue rgb),
991 "Converts a color in RGB color space to HSV color space.", "");
994 static wxImage_RGBValue , HSVtoRGB(wxImage_HSVValue hsv),
995 "Converts a color in HSV color space to RGB color space.", "");
998 %pythoncode { def __nonzero__(self): return self.Ok() }
1003 ///void wxInitAllImageHandlers();
1006 def InitAllImageHandlers():
1008 The former functionality of InitAllImageHanders is now done internal to
1009 the _core_ extension module and so this function has become a simple NOP.
1017 const wxImage wxNullImage;
1020 //---------------------------------------------------------------------------
1022 MAKE_CONST_WXSTRING(IMAGE_OPTION_FILENAME);
1023 MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT);
1024 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X);
1025 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y);
1026 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION);
1027 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONX);
1028 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONY);
1029 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT);
1030 MAKE_CONST_WXSTRING(IMAGE_OPTION_QUALITY);
1034 wxIMAGE_RESOLUTION_INCHES = 1,
1035 wxIMAGE_RESOLUTION_CM = 2
1039 MAKE_CONST_WXSTRING(IMAGE_OPTION_BITSPERSAMPLE);
1040 MAKE_CONST_WXSTRING(IMAGE_OPTION_SAMPLESPERPIXEL);
1041 MAKE_CONST_WXSTRING(IMAGE_OPTION_COMPRESSION);
1042 MAKE_CONST_WXSTRING(IMAGE_OPTION_IMAGEDESCRIPTOR);
1044 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_FORMAT);
1045 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_BITDEPTH);
1049 wxPNG_TYPE_COLOUR = 0,
1050 wxPNG_TYPE_GREY = 2,
1051 wxPNG_TYPE_GREY_RED = 3
1056 wxBMP_24BPP = 24, // default, do not need to set
1057 //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors?
1058 wxBMP_8BPP = 8, // 8bpp, quantized colors
1059 wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys
1060 wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY,
1061 wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale
1062 wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette
1063 wxBMP_4BPP = 4, // 4bpp, quantized colors
1064 wxBMP_1BPP = 1, // 1bpp, quantized "colors"
1065 wxBMP_1BPP_BW = 2 // 1bpp, black & white from red
1069 DocStr(wxBMPHandler,
1070 "A `wx.ImageHandler` for \*.bmp bitmap files.", "");
1071 class wxBMPHandler : public wxImageHandler {
1076 DocStr(wxICOHandler,
1077 "A `wx.ImageHandler` for \*.ico icon files.", "");
1078 class wxICOHandler : public wxBMPHandler {
1083 DocStr(wxCURHandler,
1084 "A `wx.ImageHandler` for \*.cur cursor files.", "");
1085 class wxCURHandler : public wxICOHandler {
1090 DocStr(wxANIHandler,
1091 "A `wx.ImageHandler` for \*.ani animated cursor files.", "");
1092 class wxANIHandler : public wxCURHandler {
1098 //---------------------------------------------------------------------------
1100 DocStr(wxPNGHandler,
1101 "A `wx.ImageHandler` for PNG image files.", "");
1102 class wxPNGHandler : public wxImageHandler {
1108 DocStr(wxGIFHandler,
1109 "A `wx.ImageHandler` for GIF image files.", "");
1110 class wxGIFHandler : public wxImageHandler {
1116 DocStr(wxPCXHandler,
1117 "A `wx.ImageHandler` for PCX imager files.", "");
1118 class wxPCXHandler : public wxImageHandler {
1124 DocStr(wxJPEGHandler,
1125 "A `wx.ImageHandler` for JPEG/JPG image files.", "");
1126 class wxJPEGHandler : public wxImageHandler {
1132 DocStr(wxPNMHandler,
1133 "A `wx.ImageHandler` for PNM image files.", "");
1134 class wxPNMHandler : public wxImageHandler {
1139 DocStr(wxXPMHandler,
1140 "A `wx.ImageHandler` for XPM image.", "");
1141 class wxXPMHandler : public wxImageHandler {
1146 DocStr(wxTIFFHandler,
1147 "A `wx.ImageHandler` for TIFF image files.", "");
1148 class wxTIFFHandler : public wxImageHandler {
1155 DocStr(wxIFFHandler,
1156 "A `wx.ImageHandler` for IFF image files.", "");
1157 class wxIFFHandler : public wxImageHandler {
1163 //---------------------------------------------------------------------------
1166 #include <wx/quantize.h>
1170 wxQUANTIZE_INCLUDE_WINDOWS_COLOURS,
1171 // wxQUANTIZE_RETURN_8BIT_DATA,
1172 wxQUANTIZE_FILL_DESTINATION_IMAGE
1177 "Performs quantization, or colour reduction, on a wxImage.", "");
1179 class wxQuantize /*: public wxObject */
1186 "Reduce the colours in the source image and put the result into the
1187 destination image, setting the palette in the destination if
1188 needed. Both images may be the same, to overwrite the source image.", "
1189 :todo: Create a version that returns the wx.Palette used.");
1191 static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236,
1192 int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE)
1194 return wxQuantize::Quantize(src, dest,
1197 NULL, // eightBitData
1204 //---------------------------------------------------------------------------