Beefy Boxes and Bandwidth Generously Provided by pair Networks Joe
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Goo Canvas and transparent images

by zentara (Archbishop)
on Jul 03, 2008 at 20:02 UTC ( #695452=sourcecode: print w/ replies, xml ) Need Help??

Category: GUI Programming
Author/Contact Info zentara of perlmonks
Description: A discussion arose recently about overlaying radar weather plots on a map. Well this kind of demonstrates all you need. It shows how to load images onto the canvas, and make a color transparent. The first time it runs, it gets a little map from google, and the overlay is base64encoded into the script. It is a little green plane that flies in circles over the map. This will work with a Gnome2::Canvas also (with some minor syntax changes), but I use Goo because it implements saving to postscript (amoung other formats).

Updated 7/25/2008... added more transparency to the airplane....it was solid green, on a black background, in which the canvas made black transparent. I added semi-transparency to it, so it looks similar to see the thru clouds of a weather map. This was done by adding an alpha layer to the plane itself, and setting the alpha to black. This made the green semi-transparent by removing it's black constituent.

#!/usr/bin/perl -w
use strict;
use warnings;
use Goo::Canvas;
use Gtk2 '-init';
use Glib qw(TRUE FALSE);
use MIME::Base64;

# get a tiny map from web, if not previously downloaded
if(! -e 'usa.gif'){ 
      print "getting file from net\n";
      &get_web_file;
  }

sub get_web_file {
use LWP::Simple;
use HTTP::Status;
my $URL = 'http://www.google.com/mapdata?CxXA8zUCHYWJS_og____________A
+QwtwPM1AjWFiUv6QLACSJwBUgJVU2gBkAEP';
my $localfile = 'usa.gif';

my $rc = mirror( $URL, $localfile );
warn status_message( $rc ) if is_error( $rc );
print "done retrieval\n";
}


my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { Gtk2->main_quit; });

my $canvas = Goo::Canvas->new();
$canvas->set_size_request(320, 160);
$window->add($canvas);

my $root = $canvas->get_root_item();

# base file
my $im = Gtk2::Gdk::Pixbuf->new_from_file("usa.gif");
my $w = $im->get_width;
my $h = $im->get_height;
my $image = Goo::Canvas::Image->new(
$root, $im, 0, 0,
'width' => $w,
'height' => $h);


my $plane = get_plane();
my $pixbuf = do {
        my $loader = Gtk2::Gdk::PixbufLoader->new();
        $loader->write( $plane );
        $loader->close();
        $loader->get_pixbuf();
    };
    
my $pb2 = $pixbuf->add_alpha(1,0 ,0 ,0);     
# returns a new pixbuf
# makes black transparent
# use 0..255 for color levels, NOT hex

my $w1 = $pb2->get_width;
my $h1 = $pb2->get_height;
my $image1 = Goo::Canvas::Image->new(
$root, $pb2, $w/2, $h/2,
 'width' => $w1,
'height' => $h1);


$window->show_all();


my $id = Glib::Timeout->add (100, sub {
      $image1->rotate (5, $w/2, $h/2); #degrees ,center of rotation
           return 1;
    } );

Gtk2->main;

sub get_plane{
return  decode_base64(
'iVBORw0KGgoAAAANSUhEUgAAAFYAAAA/CAYAAAB6rT9lAAAABmJLR0QA/wD/AP+gvaeTA
+AAACXBI
WXMAAAsTAAALEwEAmpwYAAANhklEQVR42u2ay49cV17HP+dxX3WrqttuO227/QgmExPmFZ
+OEPIAZ
FjBICIksQOIPYMNq0Ii/AiHBLBAbVqxGGiSEEAgYgYhGQwKBSQLJMFach2On7Xba3VV13/
+e8WNxy
0rESYmcmMx2mvpuSSlW6v/O93/P9Pc6BFVZYYYUVPimIwxDEV8NXH3+e5xONOLbHXnSWz2
+y1LGSH
ERopBMJNWQ9XuHxtjSPWEnYf42L3dfGn/3ZYidU/9ggCm//EP2Sv8uo4IR33uLjBjioK6f
+FyCFKH
nNy+zdVpTGQa6n7BXklgE8HOitg78Afh95/8G/4q1cRnR4zT+zm/5UG8xAtvA/qX+fIjAP
+/CM/8J
mItcPOvx4S3eTDVx+wCneTr81vk/En/y7IrYA3iNy+pNbiQbmKikjSuq2/EoQPX0SiDDMk
+7XUGmP
FTVFvMuu2+dm/BqX7Uqxd6DB4oCeIABmzHqPFRp5zOLldbbbZYhHJdLssmskOngQjl5YlG
+w4lLwi
f/whuJAiQoRyMToA+KVqPU4aGrGMUwLE6CCJjCL3GudXyesDkKFZQ9ubbM96SBwtHT6ZMj
+1a0qtd
ZqWAEKNlykjvsreXkLQd3eImt9ojrPkNpmFF7B04yzlznvvVLovuLXbCGhvjkv1+zNhCiy
+Z2EoJE
ujFT29G1E45ay6zZ4rg5xgmzyWm3qmM/BE+Fp770Ci8lc6oMiIB1IJ4wWQMoKOZAC8wBu8
+bR5nN8
vv2OeObbh9UK5GEI4gke6R/kC31OUgN9ijKAyYh9RuwBk5JawOSs1Q9yoX+cR8yq87rLRu
+ExLv7M
d3lhvMmpkzNm8SabGwDXuLZ3nOPdNttvf46Hm5d58X8Oa2NwqBS7fMU7G6y5nMQmRCEich
+mZ06R+
ROJSUq/R/hwb7rCTejha2gNQxD5j7N7gyk1AzpnvL3dVN6c0pzjr1GANhx7ycBGrxAGLEn
+dYVnC4
ANmnYrqlD1tAJXP5U5w7vsdMb7G1YQjiJtu7G2yYt3n7akOxIvbjwKKkwYgWJxsaBWAwqs
+dZQB1Q
9coK7u1Na3+N7UVHWUl0kOhQU5fXuFJo9KfCXw+dYnsaYbFyOd2KCyqtIQAJYCs6UVKuiL
+1XLOhl
R5dc5OJD19nJIqIjEsIJToxPcqZ5gef/w+ObFbH3iNuTrIZGlSx0QqIBOjq99Fu5soIfqB
+v0ApwQ
gyUAQbKcuzaYFbEfE14jgyTxetkMSJzTw6xWaLRYEXuPiMgC4HeZ7Zcs2pKyW3Jdz5nXgB
+WHeLh9
iFtaJYCQMPIxudUIJyH0BJsQhQQVxqQrxd4rHC4o8AtuVT2FG3NfKiE03GxuIZsO54e2dt
+Ug3D0C
JyvmCiAl8iBNSuxiYg+RGb6DGTNN4NRhJ/Z92+pr4WtPPMdzcUq6sWChYlQ2pxcbHJ0YOq
+B/9/ce
HyRSQBwUEBGFiqJMUL7HNTmpX9C2EzJfUraQAi0FBffzwNGe/nanFS5zuejomDFTFVWckq
+8ZqjSQ
JGDw+C5n2lUsZjl5P2bdpejwEA+tWWrh8WHKJHyfV/cnTICUhkasM05bWjEiyTo6EZNljl
+6MyMeO
XrT0HyqsEWnYpVjkjEOPa9YZhZp69yl+3tzNPQZ9QDGb/8jfpcsbKZOGNpbotMPrCWnqcB
+KkBItE
Cg8OIhTeS2TIyFxJEyLwPZ3IyLzFiATtblGSkASLElCplhA7yuWp61q4wpUeXFgeXokMJQ
+z4lMhL
lGyofQxUICsqVVEphRICnzhKAZAx9lfYzvVw0oDFyjHjpKPTKVHaE2SMzlqMGpPlhkb1eD
+GsCzyI
QSgWkF6hfEurJYkT2DQm7SyNWbBXEDiB4MZHEvu74fee+Db/nEGyNWKcrzHZnLGINHGWg7
+BYIYZD
aSkQgAwaHVraVqJ9QdV4vKgpdERiLZ0GrMHojhiLVRbrb48Dd9g2DicHIneDwymWKzqwi3
+w0uJV/
n2EsyXc4scN23+CkghDThg5HR3VbhSIi0iWltKSypVUjEmUwkaCLOloZM84sXqakqceK4Q
+FCCAIC
/IQ8xKTe4usJuZ0Rbiqy+hwXxNPhV879X3fHNMBN3lTXuR5POZLUtJFARwvKWCFiR1DgpX
+9vRhre
HURB6MEBvqDoAd3RAaiW1jtADfZxcMvd7qLig7PW5W9ufxKhgkQtn6X8u4XDu00DssElgH
+RAQ2MY
DiJvdxCiYeh+W1oF6JZOe4gMrQZUTxkBuqeNee/uglgmHz8ot3GB4CxWNLTRLfbiBfvxDj
+vdXVmB
wPmK/a6jizbYSCKSJCFa7+lVRj51OBEIQiBCTV0nxAFEF6NCwWI2IncBsozM7HLz1pSx2q
+dsD5An
FSpxuPgc50+W3IqOc3Id8K/x2vaYsVvQ1BGEfRY9IAylGFTtzD4Ll5NOWowcM04LCvUgD2
+4B8h2u
z46wYS7z+jWF0g7XHkzQa4zTgjI6xtFjNbUGkRt6OWZ9OvisjwxG5oxGbklshPIFxSIhdj
+19GJHK
GXtmn/1O3W25dR/3uxN8z3Z4u09lY1KvUQEkHic8XoZBmNIRgsMog7QSpRzCebx02GAwQh
+FJQA7J
DjEIeljgcstHM25FBVUa2I0lOhhMPme/82DdsBOWL9zJA9WLqAblqYIi8fhkxizusXJBlT
+B0ZsmS
VM2BB5vBQ2WPlT1WRCjh4d21DT7rpV1+gvQBLYcFCBGhiUm9AnucNZsw6k9x0n8ksX8u/u
+w5AifO
cU6A6xThpADb0QiHSXsab3FaIJXDeIn0EnxLVbZD3F1D4+MDuVAhb1vH7S0mT3JsbYfdVB
+DGGplm
ZBsSETSxHTPuF+wRkfQdnQLkF7h4JiDki3z3LcAnJFFHF01ZP1az0CnJRkQkFsycICiJnB
+xlM93l
+juAUCjhcEv3kDBcTxIdTW9B7DObA3FKOjEE2VBXEi3AG4N1Dls1dL0iKhWqcbAvieaXuP
+S9S+LS
zt1VBYIbT4bHzs/YVVucazSSgk73lDZjpFs6E0AbvPQ4r5G+x/QZsWtoTIwOMamP0V4hw2
+B33fuK
+RYjPciWXvb0qqbWEiEsfVqz8H7waL9Um1oq/Hacdkl4VLPQPTatqWJPCBarWnoFPnLU7s
+4yMoIg
US4m9R5rPSFIWpGR6YbeZKQ2JhYCfETkBdgRmatoy5jU5uTtWU43JXuLX+SR+nXx+s7dl1
+vAN8Rf
/iuBU1d4w93g2qjDTYYkMxsBScr4eE+tl8nMAX01EGE9+AVlXVI6D21J0w87EH8g4QHIMa
+PMYNIU
nTuQGXk4wlp3gxtdTt4VFAYIFcUdXjkZF1TJMe7bLJjHAsaaVChUERP78o4DSDUkPVlSth
+5nd9m+
5UFJdO5BVHQdeFmwqMArkE4Tu5b2HaAbKjxlQBc9VDvc+v5fiG9e/3gtrWD76fAbZ17kZV
+NRuatc
1RJp99mPz3Ayr6i0XZYmDU0LkpQ4CISdM+9SolDS9FNyt6By6yTuFrUdas3czZn7oYRyeJ
+wwBBnw
yrx3csDtF5IxsQdsUlh88HhpsNLilSVIgfEBJyRSROAzcrfP3AFmRCJ7ejcldw29T0i0wa
+gRSRTw
0oLxeJGR+aGm1iEjt1d5fb7JfZ0kLdbZsCPy8lEe7r8uLl2/287rA2cF76vPAqe+yGcvzJ
+mnV7hS
9PRxSppwIDsYOiIin6CDHIrr1iKtxrUaYYEGkDvsRB5cjA4BXEVTG7yWS0Uvu7mwVEv/Mv
++1t3xE
AmiNPvJeL65CS92IodqyGu0MLHbYKYAZ4CxyJNDKYrzHqwjpA0J1NLVZqtthREuNIgqGtg
+NMQlKv
c7R+iVcuId7YBvgOz/yQhzCC7V8LXzl9khdMh/MLap2TJt3ysvBBJIigyCiYNRMyXzGvM4
+6wxzOl
gWiTTbPNtomJXUTi1VCnWoFyEdpLpE+G7O4Uqne4brARJcCJhMxLChuhvUI7UFIgQ4T1I0
+YesMfY
NDtsNxFR/zCflzULmZDT0op11n1Pw3ux9wdiT8KCqh0z9gpVPc7PdS+JV7Y/0enWH4o//v
+cfwpDl
REQ0BbTF1w6DZmwkUuwz2+uoG48vSroaqB2u0yTO0sFQQvmSsvB4t8vNnR6fHeHIUUHwDt
+f19A1Q
pUQlcNUIc+OZe1TZQfwg//3RTrcEN7bYsoDLyFzKyI7IbMbIarQZMbUSzIiJA2zO0X6TE/
+0WWyYn
N4BLyW1C5EZMbUzUj8lMzsilpP2EzAF2iy37UX38/7t57JTYj0isQjQRUTDYW8sqoVtnZC
+uKGtpW
k7c/y4X+eZ59DeAxnvzpS7wiJH0jQIwZrYEVBrsPPkREdUC0IxI/ZXooThh+pMRe4LPmGj
+eq8zxQ
j5l2E44oRyMtfbPGmhuRF5vc50ps90s82T0vnr0G8Gh48nSECBrR7LBrznJ6WjKXEalVRK
+GlWhzj
mNHI6iwXDPz94ZrHftL4Xnjh19/gqswZXyxo1HE2vgKwzbVvpcTuOjf+e8rU/7b4nb/+oP
+9/M3zj
N3ep5GlOfNHQiFOc/lWJCDvc+NaEiZtTvHSWLXdRPPq3P1GKPc9nzCanhEU2ll5kZAXAGc
+6UGhkc
pgbxoS/7F/hSV9ORMarAkpEVAiHOcbYEjcN0Cfmn4kxshRVWWGGFFVZYYYUVVlhhhRVWWG
+GFFVb4
icP/Ao7nzeTzMzF3AAAAAElFTkSuQmCC');
}

Comment on Goo Canvas and transparent images
Download Code

Back to Code Catacombs

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://695452]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (6)
As of 2014-04-19 11:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (480 votes), past polls