Re: Code::Blocks and Magick++.h
Bob Friesenhahn <[email protected]> Sun, 14 Apr 2013 09:47:16 -0500 (CDT)
| Newsgroups | gmane.comp.video.graphicsmagick.apis |
|---|---|
| Message-ID | <[email protected]> |
On Fri, 12 Apr 2013, Herbert Elwood Gilliland III wrote:
> I want to use ImageMagick / GraphicsMagick to load texture data into OpenGL as a cross-platform solution. I'm
> using Code::Blocks. I cannot find good information regarding use of ImageMagick in Code::Blocks.
>
> 1) Does anyone have a working, relatively recent and definitive guide to getting Code::Blocks to find and
> properly use Magick++.h? I am using the OpenGL template for mingw/gcc on Windows platform.
> 2) I have written this code for Loading, which loads an image into a "CPU Image" based from data collected by
> Magick++.h -- I have another version that uses GDI+ as a fallback for MSVC++. Is this what it should be?
This code can not compile.
>
> bool Load( string filename, Indexed<GLubyte> *pixels, int *w, int *h ) {
> Magick::Image magick();
> magick.read(filename.c_str());
The filename argument is already a std::string so you should remove
the .c_str() bit since it is just doing more work.
> *w=(int) magick.GetWidth();
> *h=(int) magick.GetHeight();
There are no GetWidth() and GetHeight() methods, however there are
columns() and rows() methods which behave as you expect.
> Magick::Color sample;
> (*pixels).Size( (size_t) w * 4, (size_t) h );
I am not familiar with the GLU API but the above can likely be written
pixels->Size( (size_t) w * 4, (size_t) h );
since pixels is a pointer.
> PixelPacket *pix=magick.getPixels(0,0,w,h);
> for ( int x=0; x<w; x++ ) for ( int y=0; y<h; y++ ) {
This strategy is not good. It is much better to use getPixels() to
get just one row at a time rather than the whole image. This is more
scalable to larger images, works better with the CPU cache, is likely
to optimize better, and simplifies the using code. So move the
getPixels() into the loop. If you need to do something like change
the row order, then you can simply change the 'y' loop:
for ( int x=0; x<w; x++ )
{
PixelPacket *pix=getPixels(x,0,w,1);
for ( int y=0; y<h; y++ )
{
...
> sample = pix[w*y+x];
> (*pixels)(x ,y) = (GLubyte) ( iratiod(sample.blueQuantum(), (double) MaxRGB)*255.0 );
> (*pixels)(x + 1,y) = (GLubyte) ( iratiod(sample.greenQuantum(), (double) MaxRGB)*255.0 );
> (*pixels)(x + 2,y) = (GLubyte) ( iratiod(sample.redQuantum(), (double) MaxRGB)*255.0 );
> (*pixels)(x + 3,y) = (GLubyte) ( 1.0 / iratiod(sample.alphaQuantum(), (double) MaxRGB)*255.0 );
> }
> return true;
> }
>
> The Indexed template is similar to a stl vector.
It looks interesting. Make sure to post your final working solution.
Bob
--
Bob Friesenhahn
[email protected], http://www.simplesystems.org/users/bfriesen/
GraphicsMagick Maintainer, http://www.GraphicsMagick.org/
------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
Graphicsmagick-apis mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/graphicsmagick-apis