Common bitmap manipulations in Scol¶
In the standard API, a bitmap is an Scol object with an opaque type ObjBitmap. You can not modify directly its structure.
These objects are rather heavy. Available functions are documented in this section.
When we create or load a bitmap, it is loaded in memory until it is destroyed. Thus, destroy it when we no longer need it.
Create and destroy¶
To create a bitmap object, you can load a graphic resource (jpeg, targa or bmp formats only) or create it ex nihilo.
All these functions return an bitmap object, except the destruction function.
Load from a graphic resource¶
Supported formats are bmp, jpeg and targa only. For the png format, see Common AlphaBitmap manipulations in Scol.
BMP format :¶
_LDbitmap : <channel> <reference_graphic_file>
tyepof bmp = ObjBitmap;; ... set bmp = _LDbitmap _channel _checkpack "dir_1/dir_2/file.bmp";
JPEG format¶
_LDjpeg : <channel> <reference_graphic_file>
tyepof jpeg = ObjBitmap;; ... set jpeg = _LDjpeg _channel _checkpack "dir_1/dir_2/file.jpg";
TARGA format¶
_LDtga : <channel> <reference_graphic_file>
tyepof tga = ObjBitmap;; ... set tga = _LDtga _channel _checkpack "dir_1/dir_2/file.tga";
Create an ObjBitmap¶
Pratically, we initialize the object with the Scol function _CRbitmap : _CRbitmap <channel> <width> <height>
Next, but this is optional, we fill it with a color : _FILLbitmap : _FILLbitmap <bitmap_object> <color_24bits>
typeof bmp = ObjBitmap;; ... set bmp = _FILLbitmap _CRbitmap _channel 320 240 0x777777;
Destroy an ObjBitmap¶
_DSbitmap : _DSbitmap <bitmap_object>
If the bitmap object is a global variable, we should always set it to nil after the destruction. Indeed, the value can keep in the undefined state.
Example¶
We load the Scol logo (line 1) in the current channel. Next, we get its width (line 2) and we write its value in the console.
Then, we destroy the bitmap (line 3) and we set the variable to nil (line 4). In the rest of code (lines N), it is very judicious to verify always if the object is at nil (or not) before perform any transformations/manipulations.
typeof bitmap = ObjBitmap;; fun main ()= _showconsole; set bitmap = _LDbitmap _channel "logo.bmp"; // line 1 let _GETbitmapSize bitmap -> [width _] in // line 2 _fooId width; // 64 _DSbitmap bitmap; // line 3 set bitmap = nil; // line 4 // do anything // lines N 0;;
Other examples¶
Create, copy, draw and save a bitmap¶
This example shows some common bitmap's manipulations : creation, load, copy, draw, blur, etc ...
fun transform (bmp)= // retrieve the size of the bitmap let _GETbitmapSize bmp -> [width height] in // load the Scol logo let _LDbitmap _channel _checkpack "logo.bmp" -> logo in // create a font-reference from Arial. With 1800, the string will displayed upside down let _CRfont _channel 24 1800 FF_WEIGHT "Arial" -> font in ( // draw a blue rectangle inside our bitmap. The border has a width of 4 pixels _DRAWrectangle bmp 25 25 width-50 height-50 DRAW_SOLID 4 0xdd4444 DRAW_INVISIBLE 0; // copy the logo at the top left corner of the rectangle with a transparency color (here, white) _CPbitmap24 bmp 10 10 logo 0 0 64 64 0xFFFFFF; // draw a red circle at the center of the bitmap _DRAWcircle bmp width/2 height/2 200 DRAW_SOLID 2 0x4444dd DRAW_INVISIBLE 0; // draw a gradent inside a second rectangle _DRAWgradient bmp (width/2)-100 (height/2)-100 200 200 0x00FF00 0x006600 90; // Write a string at the center of the bitmap _DRAWtext bmp font width/2 height/2 TD_CENTER|TD_BASELINE 0xDddDdd "Hello wolrd !"; // copy the logo at the bottom right corner of the rectangle without a transparency color _CPbitmap24 bmp width-74 height-74 logo 0 0 64 64 nil; // process a gaussian blur on a second logo _BLURbitmap bmp width-74 height-74 64 64 10 5; // destroy the font, no longer needed _DSfont font; 0 );; fun main ()= _showconsole; // create an empty bitmap with a given size (500 x 500 pixels) let _CRbitmap _channel 500 500 -> bmp in ( // paint the bitmap in white _FILLbitmap bmp 0xFFFFFF; // call the function to transform our bitmap transform bmp; // save the result in a jpg file _SAVEjpeg bmp _getmodifypack "examples/bitmap/transformation.jpg" 85; // end _DSbitmap bmp; // don't forget to destroy the bitmap at the end _fooS "Done !"; 0 );;
Colorize a bitmap pixel by pixel¶
typeof window = ObjWin;; typeof bmp = ObjBitmap;; /* Set the color for each pixel. If the pixel is in the lower left half, its color is black. Otherwise, its color is random. Prototype : fun [I I I I] I */ fun bypixel (x, y, width, height)= if x >= width then ( set x = 0; set y = y+1 ) else 0; if y >= height then 0 // end ! else let if x < y*2 then 0x000000 else (mod rand 512) * (mod rand 0xFFFFFF) -> color in ( _PUTpixel24 bmp x y color; _PAINTwindow window; bypixel x+1 y width height );; /* Paint the main window : the bitmap is displayed inside it Prototype : fun [ObjWin I] I */ fun CBpaint (win, user_parameter)= _BLTbitmap window bmp 0 0; 0;; fun CBend (win, user_parameter)= _DSbitmap bmp; // we destroy the bitmap object _closemachine;; // we exit the program fun main ()= _showconsole; srand (time); // initialize random // create and fill a bitmap set bmp = _FILLbitmap _CRbitmap _channel 200 100 0xFFFFFF; // create a window set window = _CRwindow _channel nil 0 0 200 130 WN_MENU "Bitmaps > Bypixels"; _CBwinDestroy window @CBend 0; _CBwinPaint window @CBpaint 0; // call the function to set each pixel color bypixel 0 0 200 100; _fooS "Done !"; 0;;
Updated by iri about 12 years ago · 1 revisions