Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^2: wxPerl image handling (short & sweet). (iewxPerl Tutorial 2)

by Steve_BZ (Chaplain)
on Sep 10, 2009 at 01:06 UTC ( [id://794478]=note: print w/replies, xml ) Need Help??


in reply to Re: wxPerl image handling (short & sweet).
in thread wxPerl image handling (short & sweet).

As of today the following works. I made three changes:

  • Removed use Wx::Image;
  • Replaced the image file name with one on my system (ie Create "c:\\halo2.jpg" or change the file name and/or path.)
  • Replaced $bmp = $image->ConvertToBitmap(); with $bmp=Wx::Bitmap->new( $image );
Here is the full code (don't forget to change the image path and name):

#!/usr/bin/perl use Wx; package MyApp; #As always, we need to subclass Wx::App and populate it with a frame. use strict; use vars qw(@ISA); @ISA=qw(Wx::App); sub OnInit { my $this = @_; my $frame = MyFrame->new( "Mini-image demo", [-1,-1], [-1,-1]); # if the frame didn't get created, exit early. don't use die here, as +it seems to be a little unstable... # if OnInit returns false,though, wx will clean up after itself nicely +. unless ($frame) {print "unable to create frame -- exiting."; return +undef} $frame->Show( 1 ); 1; #everything's ok, on with the show. } package MyFrame; # subclass wx::Frame to insert the image control. use vars qw(@ISA); use strict; # # All we load here are 2 constants used # to keep the image stretched to the dimensions of the window. # use Wx qw( wxWidth wxHeight); # # Wx::Image loads the Image control and all of the Image handlers. # use IO::File; @ISA=qw(Wx::Frame); sub new { my $class = shift; my $this = $class->SUPER::new( undef, -1, $_[0], $_[1], $_[2] ); # # replace the filename with something appropriate. # my $file = IO::File->new( "c:\\halo2.jpg", "r" ) or return undef; binmode $file; # # define a handler for jpeg images. # handlers are half of what translates file formats (.jpg in thi +s case) # into streams readable by wxBitmap objects for diplay. # yes, this means you typically can't cram a file's contents int +o # a wxBitmap control -- the exception being windows bitmaps. # # There is a method called 'Wx::Image::FindHandlerType', but I c +ouldn't # get the thing to work in any way, shape or form. # my $handler = Wx::JPEGHandler->new(); # # wxImages are the other half of getting images displayed -- # they hold the data stream created by a handler. # Although there's many functions that can be performed with an +wxImage, # all we're interested is turning the stream into a bitmap. # my $image = Wx::Image->new(); my $bmp; # used to hold the bitmap. # # here we load the file into $image. simple enough. # $handler->LoadFile( $image, $file ); # # and here, we turn the data in $image into a bitmap, and store +in $bmp. # if the data in $bmp is bad for some reason, $bmp->Ok() will fa +il. #$bmp = $image->ConvertToBitmap(); $bmp=Wx::Bitmap->new( $image ); if( $bmp->Ok() ) { # create a static bitmap called ImageViewer that displays the # selected image. $this->{ImageViewer}= Wx::StaticBitmap->new($this, -1, $bmp); } # At this point, we could just return the frame, and be ok. # unfortunately, the static bitmap could be *really* static and +not # resize itself when the window's resized, which'd look pretty u +gly. # # To make sure everything looks ok, we'll assign constraints to # Imageviewer. # Layout constraints determine how controls will appear within t +he # window. They consist of 4 members : left, top, width and heigh +t. # constraints are objects by themselves, and need to be assigned + to # objects in order to have any use. We'll be using this contstra +int # in order to stretch the picture out to the full size of the wi +ndow. # my $b1 = Wx::LayoutConstraints->new(); # set the upper left corner to absolute [0,0]. # if there were other controls using constraints, we could change +these to # something like $b1->left->RightOf ($widget, 5) to make this cont +rol appear # 5 pixels to the right of $widget's constraints. $b1->left->Absolute(0); $b1->top->Absolute(0); # now set the width and height to 100% each way. $b1->width->PercentOf( $this, wxWidth,100); $b1->height->PercentOf( $this, wxHeight, 100); # # Now that all the dimensions of the constraint are complete, # assign it to ImageViewer. # $this->{ImageViewer}->SetConstraints( $b1 ); $this; # return the frame object to the calling application. } package main; my $app = MyApp->new();# create an instance of the Wx::App-derived cla +ss $app->MainLoop(); # run

Replies are listed 'Best First'.
Re^3: wxPerl image handling (short & sweet).
by Anonymous Monk on Dec 27, 2009 at 06:04 UTC
    Big thank you for this tutorial. It has been a massive help. ^_^
Re^3: wxPerl image handling (short & sweet).
by rp{erl}D (Initiate) on Jan 09, 2010 at 19:26 UTC
    This script didn't run for me. The error message is: OnInit must return a true return value at C:\RPD Programming\RPD wxPerl\Perlmonk s wxPerl tutorial\image.pl line 119 unable to create frame -- exiting. C:\RPD Programming\RPD wxPerl\Perlmonks wxPerl tutorial> What happened here?
      Create "c:\\halo2.jpg" or change the file name and/or path.
      Well, I just checked it again and it's fine on my system. Are you sure your wx install was OK?

      Did you create the image or change the image line?

      Steve

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (2)
As of 2024-04-20 06:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found