Create a bitmap and drawing in it?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 05:59, xxxxxxxx wrote:
Have forgotten all about the GeClipMap. Looks like you initialize it with your BaseBitmap and away you go. Aha!
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 08:28, xxxxxxxx wrote:
Doh!
I'd like to try that. But I can't figure out how to write the Init() function for the GeClipMap class.
I've looked through the archives. And none of the code posted works.Example:
AutoAlloc<GeClipMap> gcm; if(!cm) return FALSE; gcm->Init(1024L, 1024L, 24); <---Does not work gcm->BeginDraw();
I've got my BaseBitmap allocated and initialized.
And I've got my GeClipMap allocated.
But when I try to initialize the GeClipMap with my BaseBitmap. It doesn't work:BaseBitmap *bmp = BaseBitmap::Alloc(); if (!bmp) return FALSE; bmp->Init(1024L,1024L,24); AutoAlloc<GeClipMap> gcm; if(!gcm) return FALSE; //Now how do I Init() the GeClipMap with my BaseBitmap?
The SDK says to do it like this: **
IMAGERESULT
[URL-REMOVED] Init(BaseBitmap
[URL-REMOVED]* bm); **
But how the heck are we supposed to use this IMAGERESULT type?The thing that I have the most trouble figuring out in the C4D SDK is how to allocate and initialize the various classes. It's almost never documented.
I hope that changes in the future.-ScottA
[URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 09:54, xxxxxxxx wrote:
Originally posted by xxxxxxxx
The SDK says to do it like this: **
IMAGERESULT
[URL-REMOVED] Init(BaseBitmap
[URL-REMOVED]* bm); **
But how the heck are we supposed to use this IMAGERESULT type?IMAGERESULT is the returned result type when you call Init().
In the docs you can see below it that it can be one of the listed values : IMAGERESULT_OK, IMAGERESULT_NOTEXISTING, IMAGERESULT_WRONGTYPE etc.
So to initialize the clipmap with your bitmap you should call:if (gcm->Init(bmp)==IMAGERESULT_OK) { gcm->BeginDraw(); // Draw in the clipmap gcm->EndDraw(); }
But it's not necessary to init the clipmap with a just created bitmap, clipmap can do that if you call gcm->Init(1024L, 1024L, 24L). Why do you say that initializing the clipmap with this method doesn't work ?
You can access at any time the clipmap bitmap with GetBitmap() method.Originally posted by xxxxxxxx
The thing that I have the most trouble figuring out in the C4D SDK is how to allocate and initialize the various classes. It's almost never documented.
I hope that changes in the future.In GeClipMap documentation, just at the end of the class description or header:
"Has to be created with Alloc() and destroyed with Free(). You can use AutoAlloc to automate the allocation and destruction based on scope."
So just what you're doing.
[URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 10:24, xxxxxxxx wrote:
This is the error I get:
AutoAlloc<GeClipMap> gcm; if(!gcm) return FALSE; gcm->Init(1024L, 1024L, 24L); //Error:Pointer to an incomplete class type is not allowed
I'm using this code in the Command() method of a dialog plugin. Because it's just a plugin that I have already installed and handy. Could it be that this is causing a problem?
Should I try this code in a different type of plugin?
Does this code maybe require a virtual method() to be overwritten that I'm not using?-ScottA
Update - Doh! My bad.
Apparently. I was missing an include: #include lib_clipmap.h
Normally when I'm missing an #include. VS gives me an "undefined error".
I've never seen this type of error happen before.
Sorry for being such a noob. -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 11:20, xxxxxxxx wrote:
@ScottA: An incomplete Type is only forward declared and not implemented yet.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 11:21, xxxxxxxx wrote:
Originally posted by xxxxxxxx
Update - Doh! My bad.
Apparently. I was missing an include: #include lib_clipmap.h
Normally when I'm missing an #include. VS gives me an "undefined error".
I've never seen this type of error happen before.
Sorry for being such a noob.No problem, you're welcome . This is the kind of issues we all get when we begin coding in C++.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 28/04/2012 at 18:43, xxxxxxxx wrote:
One last question.
Because I've switched to GeClipMap. How do I save the changes I make to my image?
Everything I'm seeing regarding saving revolves around BaseBitmap.Here's an example where I edit an image from a path:
Filename fn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimage.jpg"; //Get the path to an image Bool ismovie = FALSE; //Set if it's an image or a movie type image AutoAlloc<GeClipMap> gcm; //Create an instance of the GeClipMap class gcm->Init(fn, 0, &ismovie); //Initialise it using the image in our path LONG width = gcm->GetBw(); //Get the image's width LONG height = gcm->GetBh(); //Get the image's height GePrint("Width: " + LongToString(width) + ", Height: " + LongToString(height)); gcm->BeginDraw(); gcm->SetColor(1.0, 1.0,1.0); //Set the color to white gcm->FillRect(50,50,100,100); //Create a filled rectangle area gcm->EndDraw(); LONG getx=80, gety=80; //The pixel to get the color from LONG getr=0, getg=0, getb=0, geta=0; //Init the rgba values with the value of zero gcm->GetPixelRGBA(getx, gety, &getr, &getg, &getb, &geta); //Get the Pixel colors GePrint("r: " + LongToString(getr) + ", g: " + LongToString(getg) + ", b: " + LongToString(getb) + ", a: " + LongToString(geta)); //This part is wrong //How do I save my image after I've changed it using GeClipMap? AutoAlloc<BaseBitmap> bmp; bmp->Init(fn,0,&ismovie); bmp->Save(Filename(fn),FILTER_JPG,NULL,SAVEBIT_32b**chANNELS|SAVEBIT_GREYSCALE|SAVEBIT_ALPHA);
How do I save the image so it reflects the changes I've made to it using GeClipMap?
-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 29/04/2012 at 08:35, xxxxxxxx wrote:
Wouldn't you have to get the bitmap back out of GeClipMap? I seem to recall there's a 'GetBitmap()' function or something similar to retrieve the changed bitmap. Then you would save that.
Steve
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 29/04/2012 at 11:17, xxxxxxxx wrote:
I have no idea Steve. This is not obvious stuff. At least not to me it isn't.
There's these two separate classes(BaseBitmap&GeClipmap). And each one has it's own strengths and limitations.
And to make things more confusing...There's no clear documentation in the docs showing how to make these two classes work together. To edit or create images with them.Here's my latest attempt at loading an image. Then editing it with GeClipMap. Then saving it:
Filename fn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimage.jpg"; //Get the path to an image //Because we have to init first..Then get the image's info. We'll create a dummy BaseBitmap instance first //This BaseBitmap instance will be used just to gather inforamtion about the file we've imported AutoAlloc<BaseBitmap> file; //Create a new BaseBitmap instance file->Init(fn); //intialize it using the file path we used as the target image LONG width = file->GetBw(); //Get the image's width LONG height = file->GetBh(); //Get the image's height LONG bitDepth = file->GetBt(); //Get the image's bitdepth GePrint("Width: " + LongToString(width) + ", Height: " + LongToString(height) + ", BitDepth: " + LongToString(bitDepth)); //Now we'll create another BaseBitmap...Based on the info we gathered from the previous BaseBitmap instance //This is the one we'll edit and make changes to AutoAlloc<BaseBitmap> bmp; //Create a new image based on the file's info bmp->Init(width, height,bitDepth); file->CopyTo(bmp); //Copies the image's info over to this BaseBitmap instance //bmp->Clear(255,255,255); //Set the entire image to the color white if desired bmp->SetPen(255,255,255); bmp->Line(0,0,100,200); AutoAlloc<GeClipMap> gcm; if(!gcm) return FALSE; gcm->Init(bmp); //Initialise the clip map using the BaseBitmap above so we can save it later on gcm->BeginDraw(); gcm->SetColor(255, 0, 0); //Sets the color of the text to red gcm->FillRect(0,0,100,100); gcm->EndDraw(); Filename newfn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimagenew.jpg"; //Create a path to save our new image bmp->Save(Filename(newfn),FILTER_JPG,NULL,SAVEBIT_0); //Save the new image
The result is a copy of the source image. With a rectangle drawn with some weird missing strips. And the wrong color(green)
But at least I'm getting something as a result.
I'm slowly getting there...But I'm doing a lot of fumbling around in the dark.-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 00:09, xxxxxxxx wrote:
Originally posted by xxxxxxxx
The result is a copy of the source image. With a rectangle drawn with some weird missing strips. And the wrong color(green)
But at least I'm getting something as a result.
I'm slowly getting there...But I'm doing a lot of fumbling around in the dark. !LOL
[URL-REMOVED]Yes because after drawing to the clipmap you need to get the modified bitmap with GetBitmap() (as said Steve above). The source bitmap isn't updated automatically.
AutoAlloc<GeClipMap> gcm; if(!gcm) return FALSE; gcm->Init(bmp); //Initialise the clip map using the BaseBitmap above so we can save it later on gcm->BeginDraw(); gcm->SetColor(255, 0, 0); //Sets the color of the text to red gcm->FillRect(0,0,100,100); gcm->EndDraw(); **BaseBitmap *clipBmp** _ ** = gcm->GetBitmap() //Get modified bitmap from clipmap**_ Filename newfn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimagenew.jpg"; //Create a path to save our new image clipBmp->Save(Filename(newfn),FILTER_JPG,NULL,SAVEBIT_0); //Save the new image
EDIT: Fixed code.
[URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 08:26, xxxxxxxx wrote:
It won't let me do this: bmp = gcm- >GetBitmap(); //error: cannot access private member AutoAlloc()
-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 08:40, xxxxxxxx wrote:
Originally posted by xxxxxxxx
It won't let me do this: bmp = gcm- >GetBitmap(); //error: cannot access private member AutoAlloc()
Sorry, this is because bmp was already allocated with AutoAlloc(). We have to declare a new BaseBitmap variable to hold the modified bitmap:
BaseBitmap *clipBmp = gcm->GetBitmap();
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 09:16, xxxxxxxx wrote:
Sorry about that. I should have mentioned that I already tried assigning it to a new BaseBitmap variable like that.
The code you posted still produces a rectangle full of lines. And not the correct color for the FillRect().
An interesting thing to note is I got this same type of bad result when using SetPixelCnt() with the wrong buffer settings.-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 09:34, xxxxxxxx wrote:
Here is the code that works for me:
Filename fn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimage.jpg"; //Get the path to an image AutoAlloc<GeClipMap> gcm; //Create an instance of the GeClipMap class gcm->Init(fn,0,0); //Initialise it using the image in our path gcm->BeginDraw(); gcm->SetColor(255L,255L,255L); //Set the color to white gcm->FillRect(50L,50L,100L,100L); //Create a filled rectangle area gcm->EndDraw(); ShowBitmap(gcm->GetBitmap()); //Show the drawn bitmap
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 10:05, xxxxxxxx wrote:
Now you've got it.
Here's my little addition to it that will also save the image as well as show it in the picture viewer:
Filename fn = GeGetC4DPath(C4D_PATH_DESKTOP)+"myimage.jpg"; //Get the path to an image AutoAlloc<GeClipMap> gcm; //Create an instance of the GeClipMap class gcm->Init(fn,0,0); //Initialise it using the image in our path gcm->BeginDraw(); gcm->SetColor(255L,255L,255L); //Set the color to white gcm->FillRect(50L,50L,100L,100L); //Create a filled rectangle area gcm->EndDraw(); ShowBitmap(gcm->GetBitmap()); //Show the drawn bitmap in the picture viewer BaseBitmap *clipBmp = gcm->GetBitmap(); //Get the modified bitmap from GeClipMap Filename newfn = GeGetC4DPath(C4D_PATH_DESKTOP)+"newimage.jpg"; //Create a path to save our new image clipBmp->Save(Filename(newfn),FILTER_JPG,NULL,SAVEBIT_0); //Save the new image
Please don't kill me.
But could you possibly show me how to write the PolyLine code?
It requires a GE_POINT2D struct pointer. And I can't figure out how to write that part.-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 12:20, xxxxxxxx wrote:
I've tried a whole bunch of different things. But I just can't get the struct to work.
Example#1
GE_POINT2D *points; //<--Error. Variable is not initialized!! //Setting it to NULL doesn't work LONG x = points->x = 5; LONG y = points->y = 25; gcm->PolyLine(20, points);
Example#2
Accessing the struct directly without pointers crashes C4DGE_POINT2D points; LONG x = points.x = 5; LONG y = points.y = 25; gcm->PolyLine(20, &points);
Can anyone tell me how to do this?
I've got all the parts and pieces. But I just can't make C4D happy.-ScottA
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 15:04, xxxxxxxx wrote:
Hi,
You have to initialize an array of struct (GE_POINT2D in this case) :
GE_POINT2D points[] = //Define an array of GE_POINT2D { {200L,200L}, //x = 200L, y = 200L {250L,250L}, //etc. {200L,300L} }; gcm->PolyLine(3, points); //Draw the polyline with the given 3 points
This is a bit tricky at the beginning .
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 30/04/2012 at 15:34, xxxxxxxx wrote:
Wonderful.
I think I've got everything I need now.
If not... too bad. Because I've bothered you enough about this.Thanks a lot.
You've really helped me (and probably many others) out a great deal with this.-ScottA