Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Goo Canvas and transparent images

by zentara (Archbishop)
on Jul 03, 2008 at 20:02 UTC ( [id://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');
}

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others cooling their heels in the Monastery: (11)
As of 2024-04-23 08:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found