[fpc-pascal] Save image into BMP or JPEG using Free Pascal (Save screenshot of OpenGL scene)
michalis.kambi at gmail.com
Wed Feb 20 06:35:56 CET 2008
Jakub Marian wrote:
> I need to save data stored in memory into .bmp or (which would be the better
> variant) into .jpg file. Actually what I want to do is to save the OpenGL
> screen (probably using glReadPixels() function) into image. I've downloaded
> PasJPEG, but it doesn't seem to be working. When I try to compile example
> program for PasJPEG, I get: 'Error: Wrong number of parameters specified for
> call to "error_exit"'
> Do you know any efficient way to save glReadPixels into .bmp or .jpeg file?
> It would be very helpful for me.
A little shameless plug, but I have implemented in my engine exactly
what you're looking for. See [http://vrmlengine.sourceforge.net/], in
engine sources look in kambi_vrml_game_engine/images/ subdirectory.
Images.pas unit there is used to load/save images to various formats,
including .bmp and .jpeg. BMP handling is done in images_bmp.inc file,
and JPEG is inside images_jpeg.inc. JPEG support is quite a hack
(although works successfully since a long time :) ) --- I use PasJPEG
(see KambiPasJpeg unit) to just convert betweeen bmp<->jpeg, this allows
me to save/load jpeg files by saving/loading bmp files under the hood.
The image format in the memory is clearly specified, as the main use of
this unit is to cooperate with OpenGL (for loading images, textures,
saving screenshots etc.). See TImage class comments, basically RawPixels
is simply a pointer to an array of Width * Height pixel values, and each
descendant of TImage specifies the exact layout of "pixel" --- e.g. for
TRGBImage a pixel is just 3 bytes, for red/green/blue.
The way to grab screenshot to TRGBImage is inside
kambi_vrml_game_engine/opengl/glimages.pas unit, see SaveScreen_noflush.
Yeah, it's basically just a glReadPixels call, with some safeguarding
(setting OpenGL read buffer and pixel store pack parameters).
Hope this will help,
More information about the fpc-pascal