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 // Constants for wxImage::Scale() for determining the level of quality
34 wxIMAGE_QUALITY_NORMAL = 0,
35 wxIMAGE_QUALITY_HIGH = 1
38 //---------------------------------------------------------------------------
41 DocStr(wxImageHandler,
42 "This is the base class for implementing image file loading/saving, and
43 image creation from data. It is used within `wx.Image` and is not
44 normally seen by the application.", "");
45 class wxImageHandler : public wxObject {
47 // wxImageHandler(); Abstract Base Class
49 wxString GetExtension();
51 wxString GetMimeType();
53 //bool LoadFile(wxImage* image, wxInputStream& stream);
54 //bool SaveFile(wxImage* image, wxOutputStream& stream);
55 //virtual int GetImageCount( wxInputStream& stream );
57 bool CanRead( const wxString& name );
58 %Rename(CanReadStream, bool, CanRead( wxInputStream& stream ));
60 void SetName(const wxString& name);
61 void SetExtension(const wxString& extension);
62 void SetType(long type);
63 void SetMimeType(const wxString& mimetype);
65 %property(Extension, GetExtension, SetExtension, doc="See `GetExtension` and `SetExtension`");
66 %property(MimeType, GetMimeType, SetMimeType, doc="See `GetMimeType` and `SetMimeType`");
67 %property(Name, GetName, SetName, doc="See `GetName` and `SetName`");
68 %property(Type, GetType, SetType, doc="See `GetType` and `SetType`");
72 //---------------------------------------------------------------------------
75 DocStr(wxPyImageHandler,
76 "This is the base class for implementing image file loading/saving, and
77 image creation from data, all written in Python. To create a custom
78 image handler derive a new class from wx.PyImageHandler and provide
79 the following methods::
81 def DoCanRead(self, stream) --> bool
82 '''Check if this handler can read the image on the stream'''
84 def LoadFile(self, image, stream, verbose, index) --> bool
85 '''Load image data from the stream and load it into image.'''
87 def SaveFile(self, image, stream, verbose) --> bool
88 '''Save the iamge data in image to the stream using
89 this handler's image file format.'''
91 def GetImageCount(self, stream) --> int
92 '''If this image format can hold more than one image,
93 how many does the image on the stream have?'''
95 To activate your handler create an instance of it and pass it to
96 `wx.Image_AddHandler`. Be sure to call `SetName`, `SetType`, and
97 `SetExtension` from your constructor.
100 class wxPyImageHandler: public wxImageHandler {
102 %pythonAppend wxPyImageHandler() "self._SetSelf(self)"
104 void _SetSelf(PyObject *self);
108 //---------------------------------------------------------------------------
111 class wxImageHistogram /* : public wxImageHistogramBase */
116 DocStr(MakeKey, "Get the key in the histogram for the given RGB values", "");
117 static unsigned long MakeKey(byte r,
122 bool, FindFirstUnusedColour(byte *OUTPUT,
127 byte startB = 0 ) const,
128 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
129 "Find first colour that is not used in the image and has higher RGB
130 values than startR, startG, startB. Returns a tuple consisting of a
131 success flag and rgb values.", "");
135 "Returns the pixel count for the given key. Use `MakeKey` to create a
136 key value from a RGB tripple.", "");
137 unsigned long GetCount(unsigned long key) {
138 wxImageHistogramEntry e = (*self)[key];
143 "Returns the pixel count for the given RGB values.", "");
144 unsigned long GetCountRGB(byte r,
147 unsigned long key = wxImageHistogram::MakeKey(r, g, b);
148 wxImageHistogramEntry e = (*self)[key];
152 DocStr(GetCountColour,
153 "Returns the pixel count for the given `wx.Colour` value.", "");
154 unsigned long GetCountColour(const wxColour& colour) {
155 unsigned long key = wxImageHistogram::MakeKey(colour.Red(),
158 wxImageHistogramEntry e = (*self)[key];
166 //---------------------------------------------------------------------------
169 "A platform-independent image class. An image can be created from
170 data, or using `wx.Bitmap.ConvertToImage`, or loaded from a file in a
171 variety of formats. Functions are available to set and get image
172 bits, so it can be used for basic image manipulation.
174 A wx.Image cannot be drawn directly to a `wx.DC`. Instead, a
175 platform-specific `wx.Bitmap` object must be created from it using the
176 `wx.BitmapFromImage` constructor. This bitmap can then be drawn in a
177 device context, using `wx.DC.DrawBitmap`.
179 One colour value of the image may be used as a mask colour which will
180 lead to the automatic creation of a `wx.Mask` object associated to the
183 wx.Image supports alpha channel data, that is in addition to a byte
184 for the red, green and blue colour components for each pixel it also
185 stores a byte representing the pixel opacity. An alpha value of 0
186 corresponds to a transparent pixel (null opacity) while a value of 255
187 means that the pixel is 100% opaque.
189 Unlike RGB data, not all images have an alpha channel and before using
190 `GetAlpha` you should check if this image contains an alpha channel
191 with `HasAlpha`. Note that currently only images loaded from PNG files
192 with transparency information will have an alpha channel.", "");
196 // Pull the nested class out to the top level for SWIG's sake
197 #define wxImage_RGBValue wxImage::RGBValue
198 #define wxImage_HSVValue wxImage::HSVValue
201 DocStr(wxImage_RGBValue,
202 "An object that contains values for red, green and blue which represent
203 the value of a color. It is used by `wx.Image.HSVtoRGB` and
204 `wx.Image.RGBtoHSV`, which converts between HSV color space and RGB
206 class wxImage_RGBValue
210 wxImage_RGBValue(byte r=0, byte g=0, byte b=0),
218 DocStr(wxImage_HSVValue,
219 "An object that contains values for hue, saturation and value which
220 represent the value of a color. It is used by `wx.Image.HSVtoRGB` and
221 `wx.Image.RGBtoHSV`, which +converts between HSV color space and RGB
223 class wxImage_HSVValue
227 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.ImageFromBuffer`,
272 `wx.ImageFromData`, `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 the typemap 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, int quality = wxIMAGE_QUALITY_NORMAL ),
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`. The ``quality`` parameter
414 specifies what method to use for resampling the image. It can be
415 either wx.IMAGE_QUALITY_NORMAL, which uses the normal default scaling
416 method of pixel replication, or wx.IMAGE_QUALITY_HIGH which uses
417 bicubic and box averaging resampling methods for upsampling and
418 downsampling respectively.", "
420 It should be noted that although using wx.IMAGE_QUALITY_HIGH produces
421 much nicer looking results it is a slower method. Downsampling will
422 use the box averaging method which seems to operate very fast. If you
423 are upsampling larger images using this method you will most likely
424 notice that it is a bit slower and in extreme cases it will be quite
425 substantially slower as the bicubic algorithm has to process a lot of
428 It should also be noted that the high quality scaling may not work as
429 expected when using a single mask colour for transparency, as the
430 scaling will blur the image and will therefore remove the mask
431 partially. Using the alpha channel will work.
436 wxImage ResampleBox(int width, int height) const;
437 wxImage ResampleBicubic(int width, int height) const;
440 wxImage , Blur(int radius),
441 "Blurs the image in both horizontal and vertical directions by the
442 specified pixel ``radius``. This should not be used when using a
443 single mask colour for transparency.", "");
446 wxImage , BlurHorizontal(int radius),
447 "Blurs the image in the horizontal direction only. This should not be
448 used when using a single mask colour for transparency.
452 wxImage , BlurVertical(int radius),
453 "Blurs the image in the vertical direction only. This should not be
454 used when using a single mask colour for transparency.", "");
459 wxImage , ShrinkBy( int xFactor , int yFactor ) const ,
460 "Return a version of the image scaled smaller by the given factors.", "");
463 wxImage& , Rescale(int width, int height, int quality = wxIMAGE_QUALITY_NORMAL),
464 "Changes the size of the image in-place by scaling it: after a call to
465 this function, the image will have the given width and height.
467 Returns the (modified) image itself.", "
472 // resizes the image in place
474 wxImage& , Resize( const wxSize& size, const wxPoint& pos,
475 int r = -1, int g = -1, int b = -1 ),
476 "Changes the size of the image in-place without scaling it, by adding
477 either a border with the given colour or cropping as necessary. The
478 image is pasted into a new image with the given size and background
479 colour at the position pos relative to the upper left of the new
480 image. If red = green = blue = -1 then use either the current mask
481 colour if set or find, use, and set a suitable mask colour for any
484 Returns the (modified) image itself.", "
490 void , SetRGB( int x, int y, byte r, byte g, byte b ),
491 "Sets the pixel at the given coordinate. This routine performs
492 bounds-checks for the coordinate so it can be considered a safe way to
493 manipulate the data, but in some cases this might be too slow so that
494 the data will have to be set directly. In that case you will have to
495 get access to the image data using the `GetData` method.", "");
499 void, SetRGB( const wxRect& rect,
500 byte r, byte g, byte b ),
501 "Sets the colour of the pixels within the given rectangle. This routine
502 performs bounds-checks for the rectangle so it can be considered a
503 safe way to manipulate the data.", "",
507 byte , GetRed( int x, int y ),
508 "Returns the red intensity at the given coordinate.", "");
511 byte , GetGreen( int x, int y ),
512 "Returns the green intensity at the given coordinate.", "");
515 byte , GetBlue( int x, int y ),
516 "Returns the blue intensity at the given coordinate.", "");
520 void , SetAlpha(int x, int y, byte alpha),
521 "Sets the alpha value for the given pixel. This function should only be
522 called if the image has alpha channel data, use `HasAlpha` to check
526 byte , GetAlpha(int x, int y),
527 "Returns the alpha value for the given pixel. This function may only be
528 called for the images with alpha channel, use `HasAlpha` to check for
531 The returned value is the *opacity* of the image, i.e. the value of 0
532 corresponds to the fully transparent pixels while the value of 255 to
533 the fully opaque pixels.", "");
537 "Returns true if this image has alpha channel, false otherwise.", "
539 :see: `GetAlpha`, `SetAlpha`");
544 "Initializes the image alpha channel data. It is an error to call it if
545 the image already has alpha data. If it doesn't, alpha data will be by
546 default initialized to all pixels being fully opaque. But if the image
547 has a a mask colour, all mask pixels will be completely transparent.", "");
551 bool , IsTransparent(int x, int y,
552 byte threshold = wxIMAGE_ALPHA_THRESHOLD) const,
553 "Returns ``True`` if this pixel is masked or has an alpha value less
554 than the spcified threshold.", "");
557 // find first colour that is not used in the image and has higher
558 // RGB values than <startR,startG,startB>
560 bool, FindFirstUnusedColour( byte *OUTPUT, byte *OUTPUT, byte *OUTPUT,
561 byte startR = 0, byte startG = 0, byte startB = 0 ) const,
562 "FindFirstUnusedColour(int startR=1, int startG=0, int startB=0) -> (success, r, g, b)",
563 "Find first colour that is not used in the image and has higher RGB
564 values than startR, startG, startB. Returns a tuple consisting of a
565 success flag and rgb values.", "");
569 bool , ConvertAlphaToMask(byte threshold = wxIMAGE_ALPHA_THRESHOLD),
570 "If the image has alpha channel, this method converts it to mask. All
571 pixels with alpha value less than ``threshold`` are replaced with the
572 mask colour and the alpha channel is removed. The mask colour is
573 chosen automatically using `FindFirstUnusedColour`.
575 If the image image doesn't have alpha channel, ConvertAlphaToMask does
580 bool , ConvertColourToAlpha( byte r, byte g, byte b ),
581 "This method converts an image where the original alpha information is
582 only available as a shades of a colour (actually shades of grey)
583 typically when you draw anti-aliased text into a bitmap. The DC
584 drawing routines draw grey values on the black background although
585 they actually mean to draw white with differnt alpha values. This
586 method reverses it, assuming a black (!) background and white text.
587 The method will then fill up the whole image with the colour given.", "");
592 bool , SetMaskFromImage(const wxImage & mask,
593 byte mr, byte mg, byte mb),
594 "Sets the image's mask so that the pixels that have RGB value of
595 ``(mr,mg,mb)`` in ``mask`` will be masked in this image. This is done
596 by first finding an unused colour in the image, setting this colour as
597 the mask colour and then using this colour to draw all pixels in the
598 image who corresponding pixel in mask has given RGB value.
600 Returns ``False`` if ``mask`` does not have same dimensions as the
601 image or if there is no unused colour left. Returns ``True`` if the
602 mask was successfully applied.
604 Note that this method involves computing the histogram, which is
605 computationally intensive operation.", "");
608 // void DoFloodFill (wxCoord x, wxCoord y,
609 // const wxBrush & fillBrush,
610 // const wxColour& testColour,
611 // int style = wxFLOOD_SURFACE,
612 // int LogicalFunction = wxCOPY /* currently unused */ ) ;
615 static bool , CanRead( const wxString& filename ),
616 "Returns True if the image handlers can read this file.", "");
619 static int , GetImageCount( const wxString& filename, long type = wxBITMAP_TYPE_ANY ),
620 "If the image file contains more than one image and the image handler
621 is capable of retrieving these individually, this function will return
622 the number of available images.", "");
626 bool , LoadFile( const wxString& name, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
627 "Loads an image from a file. If no handler type is provided, the
628 library will try to autodetect the format.", "");
631 bool , LoadFile( const wxString& name, const wxString& mimetype, int index = -1 ),
632 "Loads an image from a file, specifying the image type with a MIME type
638 bool , SaveFile( const wxString& name, int type ),
639 "Saves an image in the named file.", "");
643 bool , SaveFile( const wxString& name, const wxString& mimetype ),
644 "Saves an image in the named file.", "",
649 static bool , CanRead( wxInputStream& stream ),
650 "Returns True if the image handlers can read an image file from the
651 data currently on the input stream, or a readable Python file-like
657 bool , LoadFile( wxInputStream& stream, long type = wxBITMAP_TYPE_ANY, int index = -1 ),
658 "Loads an image from an input stream or a readable Python file-like
659 object. If no handler type is provided, the library will try to
660 autodetect the format.", "",
665 bool , LoadFile( wxInputStream& stream, const wxString& mimetype, int index = -1 ),
666 "Loads an image from an input stream or a readable Python file-like
667 object, using a MIME type string to specify the image file format.", "",
673 "Returns true if image data is present.", "");
674 %pythoncode { Ok = IsOk }
678 "Gets the width of the image in pixels.", "");
682 "Gets the height of the image in pixels.", "");
687 "Returns the size of the image in pixels.", "");
689 wxSize size(self->GetWidth(), self->GetHeight());
696 wxImage , GetSubImage(const wxRect& rect),
697 "Returns a sub image of the current one as long as the rect belongs
698 entirely to the image.", "");
702 wxImage , Size( const wxSize& size, const wxPoint& pos,
703 int r = -1, int g = -1, int b = -1 ) const,
704 "Returns a resized version of this image without scaling it by adding
705 either a border with the given colour or cropping as necessary. The
706 image is pasted into a new image with the given size and background
707 colour at the position ``pos`` relative to the upper left of the new
708 image. If red = green = blue = -1 then use either the current mask
709 colour if set or find, use, and set a suitable mask colour for any
710 newly exposed areas.", "
717 "Returns an identical copy of the image.", "");
720 void , Paste( const wxImage &image, int x, int y ),
721 "Pastes ``image`` into this instance and takes care of the mask colour
722 and any out of bounds problems.", "");
725 //unsigned char *GetData();
726 //void SetData( unsigned char *data );
730 "Returns a string containing a copy of the RGB bytes of the image.", "");
733 buffer data = self->GetData();
734 int len = self->GetWidth() * self->GetHeight() * 3;
736 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len));
740 "Resets the Image's RGB data from a buffer of RGB bytes. Accepts
741 either a string or a buffer object holding the data and the length of
742 the data must be width*height*3.", "");
743 void SetData(buffer data, int DATASIZE)
745 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
746 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
749 buffer copy = (buffer)malloc(DATASIZE);
751 wxPyBLOCK_THREADS(PyErr_NoMemory());
754 memcpy(copy, data, DATASIZE);
755 self->SetData(copy, false);
756 // wxImage takes ownership of copy...
760 DocStr(GetDataBuffer,
761 "Returns a writable Python buffer object that is pointing at the RGB
762 image data buffer inside the wx.Image. You need to ensure that you do
763 not use this buffer object after the image has been destroyed.", "");
764 PyObject* GetDataBuffer()
766 buffer data = self->GetData();
767 int len = self->GetWidth() * self->GetHeight() * 3;
769 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
773 DocStr(SetDataBuffer,
774 "Sets the internal image data pointer to point at a Python buffer
775 object. This can save making an extra copy of the data but you must
776 ensure that the buffer object lives longer than the wx.Image does.", "");
777 void SetDataBuffer(buffer data, int DATASIZE)
779 if (DATASIZE != self->GetWidth() * self->GetHeight() * 3) {
780 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
783 self->SetData(data, true);
789 "Returns a string containing a copy of the alpha bytes of the image.", "");
790 PyObject* GetAlphaData() {
791 buffer data = self->GetAlpha();
795 int len = self->GetWidth() * self->GetHeight();
797 wxPyBLOCK_THREADS( rv = PyString_FromStringAndSize((char*)data, len) );
803 "Resets the Image's alpha data from a buffer of bytes. Accepts either
804 a string or a buffer object holding the data and the length of the
805 data must be width*height.", "");
806 void SetAlphaData(buffer alpha, int ALPHASIZE)
808 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
809 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
812 buffer acopy = (buffer)malloc(ALPHASIZE);
814 wxPyBLOCK_THREADS(PyErr_NoMemory());
817 memcpy(acopy, alpha, ALPHASIZE);
818 self->SetAlpha(acopy, false);
819 // wxImage takes ownership of acopy...
824 DocStr(GetAlphaBuffer,
825 "Returns a writable Python buffer object that is pointing at the Alpha
826 data buffer inside the wx.Image. You need to ensure that you do not
827 use this buffer object after the image has been destroyed.", "");
828 PyObject* GetAlphaBuffer()
830 buffer data = self->GetAlpha();
831 int len = self->GetWidth() * self->GetHeight();
833 wxPyBLOCK_THREADS( rv = PyBuffer_FromReadWriteMemory(data, len) );
838 DocStr(SetAlphaBuffer,
839 "Sets the internal image alpha pointer to point at a Python buffer
840 object. This can save making an extra copy of the data but you must
841 ensure that the buffer object lives as long as the wx.Image does.", "");
842 void SetAlphaBuffer(buffer alpha, int ALPHASIZE)
844 if (ALPHASIZE != self->GetWidth() * self->GetHeight()) {
845 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
848 self->SetAlpha(alpha, true);
855 void , SetMaskColour( byte r, byte g, byte b ),
856 "Sets the mask colour for this image (and tells the image to use the
861 /*bool*/ void , GetOrFindMaskColour( byte *OUTPUT,
863 byte *OUTPUT ) const,
864 "GetOrFindMaskColour() -> (r,g,b)",
865 "Get the current mask colour or find a suitable colour.", "");
870 "Gets the red component of the mask colour.", "");
873 byte , GetMaskGreen(),
874 "Gets the green component of the mask colour.", "");
877 byte , GetMaskBlue(),
878 "Gets the blue component of the mask colour.", "");
881 void , SetMask( bool mask = true ),
882 "Specifies whether there is a mask or not. The area of the mask is
883 determined by the current mask colour.", "");
887 "Returns ``True`` if there is a mask active, ``False`` otherwise.", "");
891 wxImage , Rotate(double angle, const wxPoint & centre_of_rotation,
892 bool interpolating = true, wxPoint * offset_after_rotation = NULL) const ,
893 "Rotates the image about the given point, by ``angle`` radians. Passing
894 ``True`` to ``interpolating`` results in better image quality, but is
895 slower. If the image has a mask, then the mask colour is used for the
896 uncovered pixels in the rotated image background. Otherwise, black
897 will be used as the fill colour.
899 Returns the rotated image, leaving this image intact.", "");
902 wxImage , Rotate90( bool clockwise = true ) ,
903 "Returns a copy of the image rotated 90 degrees in the direction
904 indicated by ``clockwise``.", "");
907 wxImage , Mirror( bool horizontally = true ) ,
908 "Returns a mirrored copy of the image. The parameter ``horizontally``
909 indicates the orientation.", "");
913 void , Replace( byte r1, byte g1, byte b1,
914 byte r2, byte g2, byte b2 ),
915 "Replaces the colour specified by ``(r1,g1,b1)`` by the colour
916 ``(r2,g2,b2)``.", "");
919 wxImage , ConvertToGreyscale( double lr = 0.299,
921 double lb = 0.114 ) const,
922 "Convert to greyscale image. Uses the luminance component (Y) of the
923 image. The luma value (YUV) is calculated using (R * lr) + (G * lg) + (B * lb),
924 defaults to ITU-T BT.601", "");
928 wxImage , ConvertToMono( byte r, byte g, byte b ) const,
929 "Returns monochromatic version of the image. The returned image has
930 white colour where the original has ``(r,g,b)`` colour and black
931 colour everywhere else.", "");
935 void , SetOption(const wxString& name, const wxString& value),
936 "Sets an image handler defined option. For example, when saving as a
937 JPEG file, the option ``wx.IMAGE_OPTION_QUALITY`` is used, which is a
938 number between 0 and 100 (0 is terrible, 100 is very good).", "
940 ================================= ===
941 wx.IMAGE_OPTION_BMP_FORMAT
942 wx.IMAGE_OPTION_CUR_HOTSPOT_X
943 wx.IMAGE_OPTION_CUR_HOTSPOT_Y
944 wx.IMAGE_OPTION_RESOLUTION
945 wx.IMAGE_OPTION_RESOLUTIONX
946 wx.IMAGE_OPTION_RESOLUTIONY
947 wx.IMAGE_OPTION_RESOLUTIONUNIT
948 wx.IMAGE_OPTION_QUALITY
949 wx.IMAGE_OPTION_BITSPERSAMPLE
950 wx.IMAGE_OPTION_SAMPLESPERPIXEL
951 wx.IMAGE_OPTION_COMPRESSION
952 wx.IMAGE_OPTION_IMAGEDESCRIPTOR
953 wx.IMAGE_OPTION_PNG_FORMAT
954 wx.IMAGE_OPTION_PNG_BITDEPTH
955 ================================= ===
957 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOptionInt`");
960 void, SetOption(const wxString& name, int value),
961 "Sets an image option as an integer.", "
963 :see: `HasOption`, `GetOption`, `GetOptionInt`, `SetOption`",
967 wxString , GetOption(const wxString& name) const,
968 "Gets the value of an image handler option.", "
970 :see: `HasOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
973 int , GetOptionInt(const wxString& name) const,
974 "Gets the value of an image handler option as an integer. If the given
975 option is not present, the function returns 0.", "
977 :see: `HasOption`, `GetOption`, `SetOptionInt`, `SetOption`");
980 bool , HasOption(const wxString& name) const,
981 "Returns true if the given option is present.", "
983 :see: `GetOption`, `GetOptionInt`, `SetOption`, `SetOptionInt`");
986 unsigned long CountColours( unsigned long stopafter = (unsigned long) -1 );
987 unsigned long ComputeHistogram( wxImageHistogram& h );
989 static void AddHandler( wxImageHandler *handler );
990 static void InsertHandler( wxImageHandler *handler );
991 static bool RemoveHandler( const wxString& name );
993 static PyObject* GetHandlers() {
994 wxList& list = wxImage::GetHandlers();
995 return wxPy_ConvertList(&list);
1000 static wxString , GetImageExtWildcard(),
1001 "Iterates all registered wxImageHandler objects, and returns a string
1002 containing file extension masks suitable for passing to file open/save
1003 dialog boxes.", "");
1007 MustHaveApp(ConvertToBitmap);
1008 MustHaveApp(ConvertToMonoBitmap);
1011 wxBitmap ConvertToBitmap(int depth=-1) {
1012 wxBitmap bitmap(*self, depth);
1016 wxBitmap ConvertToMonoBitmap( byte red,
1019 wxImage mono = self->ConvertToMono( red, green, blue );
1020 wxBitmap bitmap( mono, 1 );
1027 void , RotateHue(double angle),
1028 "Rotates the hue of each pixel of the image. Hue is a double in the
1029 range -1.0..1.0 where -1.0 is -360 degrees and 1.0 is 360 degrees", "");
1032 static wxImage_HSVValue , RGBtoHSV(wxImage_RGBValue rgb),
1033 "Converts a color in RGB color space to HSV color space.", "");
1036 static wxImage_RGBValue , HSVtoRGB(wxImage_HSVValue hsv),
1037 "Converts a color in HSV color space to RGB color space.", "");
1040 %pythoncode { def __nonzero__(self): return self.IsOk() }
1042 %property(AlphaBuffer, GetAlphaBuffer, SetAlphaBuffer, doc="See `GetAlphaBuffer` and `SetAlphaBuffer`");
1043 %property(AlphaData, GetAlphaData, SetAlphaData, doc="See `GetAlphaData` and `SetAlphaData`");
1044 %property(Data, GetData, SetData, doc="See `GetData` and `SetData`");
1045 %property(DataBuffer, GetDataBuffer, SetDataBuffer, doc="See `GetDataBuffer` and `SetDataBuffer`");
1046 %property(Height, GetHeight, doc="See `GetHeight`");
1047 %property(MaskBlue, GetMaskBlue, doc="See `GetMaskBlue`");
1048 %property(MaskGreen, GetMaskGreen, doc="See `GetMaskGreen`");
1049 %property(MaskRed, GetMaskRed, doc="See `GetMaskRed`");
1050 %property(Width, GetWidth, doc="See `GetWidth`");
1056 // Make an image from buffer objects. Not that this is here instead of in the
1057 // wxImage class (as a constructor) because there is already another one with
1058 // the exact same signature, so there woudl be ambiguities in the generated
1059 // C++. Doing it as an independent factory function like this accomplishes
1060 // the same thing however.
1061 %newobject _ImageFromBuffer;
1063 wxImage* _ImageFromBuffer(int width, int height,
1064 buffer data, int DATASIZE,
1065 buffer alpha=NULL, int ALPHASIZE=0)
1067 if (DATASIZE != width*height*3) {
1068 wxPyErr_SetString(PyExc_ValueError, "Invalid data buffer size.");
1071 if (alpha != NULL) {
1072 if (ALPHASIZE != width*height) {
1073 wxPyErr_SetString(PyExc_ValueError, "Invalid alpha buffer size.");
1076 return new wxImage(width, height, data, alpha, true);
1078 return new wxImage(width, height, data, true);
1083 def ImageFromBuffer(width, height, dataBuffer, alphaBuffer=None):
1085 Creates a `wx.Image` from the data in dataBuffer. The dataBuffer
1086 parameter must be a Python object that implements the buffer interface,
1087 such as a string, array, etc. The dataBuffer object is expected to
1088 contain a series of RGB bytes and be width*height*3 bytes long. A buffer
1089 object can optionally be supplied for the image's alpha channel data, and
1090 it is expected to be width*height bytes long.
1092 The wx.Image will be created with its data and alpha pointers initialized
1093 to the memory address pointed to by the buffer objects, thus saving the
1094 time needed to copy the image data from the buffer object to the wx.Image.
1095 While this has advantages, it also has the shoot-yourself-in-the-foot
1096 risks associated with sharing a C pointer between two objects.
1098 To help alleviate the risk a reference to the data and alpha buffer
1099 objects are kept with the wx.Image, so that they won't get deleted until
1100 after the wx.Image is deleted. However please be aware that it is not
1101 guaranteed that an object won't move its memory buffer to a new location
1102 when it needs to resize its contents. If that happens then the wx.Image
1103 will end up referring to an invalid memory location and could cause the
1104 application to crash. Therefore care should be taken to not manipulate
1105 the objects used for the data and alpha buffers in a way that would cause
1106 them to change size.
1108 image = _core_._ImageFromBuffer(width, height, dataBuffer, alphaBuffer)
1109 image._buffer = dataBuffer
1110 image._alpha = alphaBuffer
1115 ///void wxInitAllImageHandlers();
1118 def InitAllImageHandlers():
1120 The former functionality of InitAllImageHanders is now done internal to
1121 the _core_ extension module and so this function has become a simple NOP.
1129 const wxImage wxNullImage;
1132 //---------------------------------------------------------------------------
1134 MAKE_CONST_WXSTRING(IMAGE_OPTION_FILENAME);
1135 MAKE_CONST_WXSTRING(IMAGE_OPTION_BMP_FORMAT);
1136 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_X);
1137 MAKE_CONST_WXSTRING(IMAGE_OPTION_CUR_HOTSPOT_Y);
1138 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTION);
1139 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONX);
1140 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONY);
1141 MAKE_CONST_WXSTRING(IMAGE_OPTION_RESOLUTIONUNIT);
1142 MAKE_CONST_WXSTRING(IMAGE_OPTION_QUALITY);
1146 wxIMAGE_RESOLUTION_INCHES = 1,
1147 wxIMAGE_RESOLUTION_CM = 2
1151 MAKE_CONST_WXSTRING(IMAGE_OPTION_BITSPERSAMPLE);
1152 MAKE_CONST_WXSTRING(IMAGE_OPTION_SAMPLESPERPIXEL);
1153 MAKE_CONST_WXSTRING(IMAGE_OPTION_COMPRESSION);
1154 MAKE_CONST_WXSTRING(IMAGE_OPTION_IMAGEDESCRIPTOR);
1156 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_FORMAT);
1157 MAKE_CONST_WXSTRING(IMAGE_OPTION_PNG_BITDEPTH);
1161 wxPNG_TYPE_COLOUR = 0,
1162 wxPNG_TYPE_GREY = 2,
1163 wxPNG_TYPE_GREY_RED = 3
1168 wxBMP_24BPP = 24, // default, do not need to set
1169 //wxBMP_16BPP = 16, // wxQuantize can only do 236 colors?
1170 wxBMP_8BPP = 8, // 8bpp, quantized colors
1171 wxBMP_8BPP_GREY = 9, // 8bpp, rgb averaged to greys
1172 wxBMP_8BPP_GRAY = wxBMP_8BPP_GREY,
1173 wxBMP_8BPP_RED = 10, // 8bpp, red used as greyscale
1174 wxBMP_8BPP_PALETTE = 11, // 8bpp, use the wxImage's palette
1175 wxBMP_4BPP = 4, // 4bpp, quantized colors
1176 wxBMP_1BPP = 1, // 1bpp, quantized "colors"
1177 wxBMP_1BPP_BW = 2 // 1bpp, black & white from red
1181 DocStr(wxBMPHandler,
1182 "A `wx.ImageHandler` for \*.bmp bitmap files.", "");
1183 class wxBMPHandler : public wxImageHandler {
1188 DocStr(wxICOHandler,
1189 "A `wx.ImageHandler` for \*.ico icon files.", "");
1190 class wxICOHandler : public wxBMPHandler {
1195 DocStr(wxCURHandler,
1196 "A `wx.ImageHandler` for \*.cur cursor files.", "");
1197 class wxCURHandler : public wxICOHandler {
1202 DocStr(wxANIHandler,
1203 "A `wx.ImageHandler` for \*.ani animated cursor files.", "");
1204 class wxANIHandler : public wxCURHandler {
1210 //---------------------------------------------------------------------------
1212 DocStr(wxPNGHandler,
1213 "A `wx.ImageHandler` for PNG image files.", "");
1214 class wxPNGHandler : public wxImageHandler {
1220 DocStr(wxGIFHandler,
1221 "A `wx.ImageHandler` for GIF image files.", "");
1222 class wxGIFHandler : public wxImageHandler {
1228 DocStr(wxPCXHandler,
1229 "A `wx.ImageHandler` for PCX imager files.", "");
1230 class wxPCXHandler : public wxImageHandler {
1236 DocStr(wxJPEGHandler,
1237 "A `wx.ImageHandler` for JPEG/JPG image files.", "");
1238 class wxJPEGHandler : public wxImageHandler {
1244 DocStr(wxPNMHandler,
1245 "A `wx.ImageHandler` for PNM image files.", "");
1246 class wxPNMHandler : public wxImageHandler {
1251 DocStr(wxXPMHandler,
1252 "A `wx.ImageHandler` for XPM image.", "");
1253 class wxXPMHandler : public wxImageHandler {
1258 DocStr(wxTIFFHandler,
1259 "A `wx.ImageHandler` for TIFF image files.", "");
1260 class wxTIFFHandler : public wxImageHandler {
1267 DocStr(wxIFFHandler,
1268 "A `wx.ImageHandler` for IFF image files.", "");
1269 class wxIFFHandler : public wxImageHandler {
1275 //---------------------------------------------------------------------------
1278 #include <wx/quantize.h>
1282 wxQUANTIZE_INCLUDE_WINDOWS_COLOURS,
1283 // wxQUANTIZE_RETURN_8BIT_DATA,
1284 wxQUANTIZE_FILL_DESTINATION_IMAGE
1289 "Performs quantization, or colour reduction, on a wxImage.", "");
1291 class wxQuantize /*: public wxObject */
1298 "Reduce the colours in the source image and put the result into the
1299 destination image, setting the palette in the destination if
1300 needed. Both images may be the same, to overwrite the source image.", "
1301 :todo: Create a version that returns the wx.Palette used.");
1303 static bool Quantize(const wxImage& src, wxImage& dest, int desiredNoColours = 236,
1304 int flags = wxQUANTIZE_INCLUDE_WINDOWS_COLOURS|wxQUANTIZE_FILL_DESTINATION_IMAGE)
1306 return wxQuantize::Quantize(src, dest,
1309 NULL, // eightBitData
1316 //---------------------------------------------------------------------------