in reply to Tk:Photo -data with binary data?

Hi, when I first encountered this, I was told( by a Perl/Tk expert) that the Photo object wants base64_encoded data, and the -file=> option, does convert the binary data to base64 internally as it is read from the disk. So I don't think there is anyway around it.

However, if you are willing to switch to Perl/Gtk2, you can load binary data. There may still be a bit of a slowdown though, because the Gtk2 pixbuf wants all images to be 8-bit 'rgb' (+ optional alpha), so the pixbuf loader converts all images to 24bit or 32 bit data. Here is a simple example:

#!/usr/bin/perl use strict; use warnings; use Gtk2 '-init'; use GD; use GD::Text::Align; my $time= localtime; my $image = new GD::Image(200,30); my $black = $image->colorAllocate(0,0,0); my $white = $image->colorAllocate(255,255,255); my $text = new GD::Text::Align( $image, font => gdLargeFont, # font => './arial.ttf', text => $time, color => $white, valign => "center", halign => "center", ); # the order of these two lines is important $image->filledRectangle( 15, 15, 150, 150, $black ); $text->draw(100,15); my $gdimage; open( IMAGE, ">",\$gdimage) || die "$!\n"; binmode( IMAGE ); print IMAGE $image->png(); close IMAGE; #gtk2 stuff my $mw = Gtk2::Window->new; my $vp = Gtk2::Viewport->new(undef, undef); $mw->add($vp); &load_image; $mw->signal_connect('destroy', sub { Gtk2->main_quit }); Gtk2->main; ########################################################### sub load_image { my $loader = Gtk2::Gdk::PixbufLoader->new; $loader->write ($gdimage); $loader->close; my $pixbuf = $loader->get_pixbuf; my $image = Gtk2::Image->new_from_pixbuf ($pixbuf); # my $pb = $image->get_pixbuf; # my ($x, $y) = ($pb->get_width, $pb->get_height); # $mw->set_title("dim ${x}x${y}"); $vp->add($image); $mw->show_all(); }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Replies are listed 'Best First'.
Re^2: Tk:Photo -data with binary data?
by BrowserUk (Patriarch) on Nov 29, 2006 at 13:21 UTC
    I was told( by a Perl/Tk expert) that the Photo object wants base64_encoded data, and the -file=> option, does convert the binary data to base64 internally as it is read from the disk. So I don't think there is anyway around it.

    Thanks. That knocks the final nail in my pursuit of a faster method using Tk.

    It seems weird to convert the binary data to base 64 though. It must at some point convert it back to binary to manipulate it and set it into the underlying hardware buffer/device context. Passing it through an ascii-based intermediate format is just pure overhead--though that does explain the rather tawdry performance of Tk image manipulations.


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      I asked about this once on comp.lang.perl.tk and Steven Lidie replied

      "The reason is described in various pieces of documentation. Tcl/Tk required (still requires?) data in "printable characters", hence the encoding of binary data.".

      I never thought about it, and just took it as one of those truths you just accept and never question. :-)


      I'm not really a human, but I play one on earth. Cogito ergo sum a bum