Here is a quick and dirty alpha blending code, for achieving a fade in/out transition between two images. It is coded is
C, with
critcl for speed, but the algorithm is very simple, a mixing of the pixels from two images returning in a third.
package require Img
package require critcl
package provide alphablend 1.0
critcl::config outdir .
critcl::cheaders -I/usr/local/include
critcl::ccode {
#include <tcl.h>
#include <tk.h>
}
::critcl::ccommand blend_img { dummy ip objc objv } {
Tk_PhotoHandle ph[3];
Tk_PhotoImageBlock ib[3];
Tcl_Obj *obj;
int i,j,k,blend,pxsiz,pitch;
unsigned char *p[3];
if (objc != 5) {
Tcl_WrongNumArgs(ip,1,objv,"img1 img2 img3 blend");
return TCL_ERROR;
}
ph[0] = Tk_FindPhoto(ip,Tcl_GetString(objv[1]));
ph[1] = Tk_FindPhoto(ip,Tcl_GetString(objv[2]));
ph[2] = Tk_FindPhoto(ip,Tcl_GetString(objv[3]));
Tcl_GetIntFromObj(ip,objv[4],&blend);
Tk_PhotoGetImage(ph[0],ib);
Tk_PhotoGetImage(ph[1],ib+1);
Tk_PhotoGetImage(ph[2],ib+2);
p[0] = ib[0].pixelPtr;
p[1] = ib[1].pixelPtr;
p[2] = ib[2].pixelPtr;
pxsiz = ib[0].pixelSize;
pitch = ib[0].pitch;
for (i=0;i<ib[0].height;i++) {
for (j=0;j<ib[0].width;j++) {
*(p[2]+i*pitch+j*pxsiz) =
(*(p[0]+i*pitch+j*pxsiz) * blend +
*(p[1]+i*pitch+j*pxsiz) * (100-blend)) / 100;
*(p[2]+i*pitch+j*pxsiz+1) =
(*(p[0]+i*pitch+j*pxsiz+1) * blend +
*(p[1]+i*pitch+j*pxsiz+1) * (100-blend)) / 100;
*(p[2]+i*pitch+j*pxsiz+2) =
(*(p[0]+i*pitch+j*pxsiz+2) * blend +
*(p[1]+i*pitch+j*pxsiz+2) * (100-blend)) / 100;
}
}
Tk_PhotoPutBlock(ph[2],ib+2,0,0,ib[0].width,ib[0].height,1);
return TCL_OK;
}
set blend 100
pack [canvas .c -width 800 -height 600]
pack [scale .sc -variable blend -orient hor] \
-fill x -expand 1
pack [button .b -text exit -command exit] -padx 30 -pady 20
update
# create a list with your pictures (the first two will be loaded)
set images {
/root/quadros/harvesters.jpg
/root/quadros/gogh29.jpg
/root/quadros/beggars.jpg
/root/quadros/brueg1-8.jpg
/root/quadros/hunters.jpg
}
proc load_imgs {} {
global images
foreach i {1 2} {
global img$i
set fn [lindex $images $i]
set img$i \
[image create photo -file $fn -width 640 -height 480]
}
}
load_imgs
set img3 [image create photo]
$img3 copy $img1
set updwait 0
proc update_img {blend} {
global img1 img2 img3 updwait
# don't let it go too fast
if {$updwait} {
return
}
incr updwait
blend_img $img1 $img2 $img3 $blend
after 50 {set updwait 0}
}
.sc config -command update_img
.c create image 50 50 -anchor nw -image $img3
Rildo Pragana