Hello,
I am new to wxWidgets. I am using wxMemoryDC with monochrome wxBitmap for drawing. wxWidgets is built with GTK+. Below is my goal:
1. Create Monochrome bitmap - wxBitmap *pbmp = new wxBitmap (100,100,1);
2. Map with Memory DC - wxMemoryDC *pmDC = new wxMemoryDC (*pbmp);
3. Select object - pmDC->SelectObject(*pBitmap);
4. Set pen (black) and brush (white)
5. Draw a rectangle - pmDC->DrawRectanglewxRect(50,50,50,50);
6. Read pixels data using wxNativePixelData using Getpixels().m_ptr
7. Send to device (printer)
Questions:
1. I would like reverse monochrome color: White: 1 Black:0 to White:0 Black:1 so that image background will be in black and rectangle will be in white. How to do this? In windows this can be done like below:
RGBQUAD[0].rgbBlue=0xFF; RGBQUAD[0].rgbGreen=0xFF; RGBQUAD[0].rgbRed=0xFF;
RGBQUAD[1].rgbBlue=0; RGBQUAD[1].rgbGreen=0; RGBQUAD[1].rgbRed=0;
2. I would like to get pixels data of wxBitmap. Does using wxNativePixelData::Getpixels().m_ptr is correct way? What is the best method?
Thanks.
Using wxBitmap (Monochrome) in WxMemoryDC
-
- In need of some credit
- Posts: 9
- Joined: Thu Jun 28, 2018 10:05 am
-
- Moderator
- Posts: 19164
- Joined: Fri Apr 21, 2006 8:03 pm
- Location: $FCE2
Re: Using wxBitmap (Monochrome) in WxMemoryDC
Support for monochrome bitmaps is very limited in wxWidgets. And wxNativePixelData is designed for 24bit RGB data, so i doubt it will give the expected results for monochrome bitmaps.
Even if it's a waste of memory, i would suggest to work with 24bit RGB bitmaps and only at the very end convert it to a 1bit bitmap.
Even if it's a waste of memory, i would suggest to work with 24bit RGB bitmaps and only at the very end convert it to a 1bit bitmap.
Use the source, Luke!
-
- In need of some credit
- Posts: 9
- Joined: Thu Jun 28, 2018 10:05 am
Re: Using wxBitmap (Monochrome) in WxMemoryDC
Thanks for your reply.
We are using wxWidgets in embedded device which has low RAM (64 MB). And, In my case I don't want to use 24 bit bitmap because it would create memory & performance issue.
So, I would like to do
1. Memory DC with Monochrome bitmap (572*2500)
2. Should be able read bitmap pixels. I need this because, finally I will send this array of pixel data to external device for printing.
Could you tell me the possible ways to do this? I can try that.
Thanks.
We are using wxWidgets in embedded device which has low RAM (64 MB). And, In my case I don't want to use 24 bit bitmap because it would create memory & performance issue.
So, I would like to do
1. Memory DC with Monochrome bitmap (572*2500)
2. Should be able read bitmap pixels. I need this because, finally I will send this array of pixel data to external device for printing.
Could you tell me the possible ways to do this? I can try that.
Thanks.
-
- Moderator
- Posts: 19164
- Joined: Fri Apr 21, 2006 8:03 pm
- Location: $FCE2
Re: Using wxBitmap (Monochrome) in WxMemoryDC
I guess the code will be running under Linux?
I can only test under Windows, and the following code worked for me:
However, this is lacking the last part, getting the raw bitmap data. I haven't found a way to do that for 1-bit data.
I can only test under Windows, and the following code worked for me:
Code: Select all
const int width = 100;
const int height = 100;
wxBitmap b( width, height, 1 );
wxMemoryDC mdc( b );
// clear background
mdc.SetBrush( *wxWHITE );
mdc.SetPen( *wxWHITE );
mdc.DrawRectangle( 0, 0, width, height );
// draw black rectangle
mdc.SetBrush( *wxBLACK );
mdc.SetPen( *wxBLACK );
mdc.DrawRectangle( width/4, height/4, width/2, height/2 );
// invert everything
mdc.Blit( 0,0, width,height, &mdc, 0,0, wxINVERT );
mdc.SelectObject( wxNullBitmap );
b.SaveFile( "d:\\_mono_test.png", wxBITMAP_TYPE_PNG );
Use the source, Luke!
-
- In need of some credit
- Posts: 9
- Joined: Thu Jun 28, 2018 10:05 am
Re: Using wxBitmap (Monochrome) in WxMemoryDC
Yes, the code will be running in Linux (GTK-2).
Thanks,
Hari
Hari
-
- Moderator
- Posts: 19164
- Joined: Fri Apr 21, 2006 8:03 pm
- Location: $FCE2
Re: Using wxBitmap (Monochrome) in WxMemoryDC
Code: Select all
#ifdef __WXGTK3__
GdkPixbuf* GetPixbufNoMask() const;
cairo_t* CairoCreate() const;
void Draw(cairo_t* cr, int x, int y, bool useMask = true, const wxColour* fg = NULL, const wxColour* bg = NULL) const;
void SetSourceSurface(cairo_t* cr, int x, int y, const wxColour* fg = NULL, const wxColour* bg = NULL) const;
#else
GdkPixmap *GetPixmap() const;
bool HasPixmap() const;
bool HasPixbuf() const;
wxBitmap(GdkPixmap* pixmap);
#endif
If you can't figure it out yourself, please open a new thread under "platform related issues".
Use the source, Luke!
-
- In need of some credit
- Posts: 9
- Joined: Thu Jun 28, 2018 10:05 am