Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Tk show image from web

by Discipulus (Canon)
on Nov 16, 2019 at 17:32 UTC ( [id://11108798]=note: print w/replies, xml ) Need Help??


in reply to Tk show image from web

Hello IB2017,

you dont need to download the image into a file: you can use LWP to grab the image and store its content inside a variable(you might need to transform it in base64) and use the -data option while building the Tk::Photo object.

-data => string Specifies the contents of the image as a string. The string can co +ntain base64 encoded data or binary data. The format of the string mu +st be one of those for which there is an image file format handler th +at will accept string data. If both the -data and -file options are s +pecified, the -file option takes precedence.

L*

PS I said TITS but you took it literally (see below: the original code posted and now changed, used breast as search word ;)

There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

Replies are listed 'Best First'.
Re^2: Tk show image from web
by IB2017 (Pilgrim) on Nov 16, 2019 at 17:56 UTC

    Thank you. This was the hint I needed. Here a working script:

    • for a given term, it searches an image in Wikipedia
    • if something is available, it grabs it and prints it in Tk

    Maybe somebody can find some inspiration

    use strict; use warnings; use HTTP::Request; use LWP::UserAgent; use JSON::PP; use LWP::Simple; use Tk; use Tk::Photo; use Tk::JPEG; use Tk::PNG; use MIME::Base64; my $ua = LWP::UserAgent->new; my $QueryString="wind park"; my $urlImage=getWikiImage($QueryString); if ($urlImage){ my $data=grabbingImage($urlImage); $data = MIME::Base64::encode_base64($data); #creating GUI my $mw = new MainWindow(); my $top = $mw->Frame()->pack(); my $img = $mw->Photo(-data => $data); my $label = $top->Label(-image => $img)->pack(); MainLoop; } sub getWikiImage{ my $QueryString=shift; print "Querying Wiki for $QueryString\n"; my $imgUrl; my $url="https://en.wikipedia.org/w/api.php?action=query&title +s=" . $QueryString . "&prop=pageimages&format=json&pithumbsize=200"; my $req = HTTP::Request->new(GET => $url); my $res = $ua->request($req); if ($res->is_success) { my $json_text= $res->content; my $decoded_json = decode_json( $json_text ); my @WikiItem = $decoded_json->{'query'}{'pages'}; foreach my $hash_ref (@WikiItem) { foreach (keys %{$hash_ref}) { $imgUrl = ${$hash_ref}{$_}{'thumbnail'}{'source'}; } } } else { print "Error\n"; } print "IMG: $imgUrl \n"; return $imgUrl; } sub grabbingImage{ my $url=shift; print "Grabbing image...\n"; my $request = new HTTP::Request 'GET', $url; my $response = $ua->request($request); if ($response->is_success) { return $response->content; } else { print $response->error_as_HTML; return 'error'; } }
      Maybe somebody can find some inspiration

      Very cool, thank you!

      #!/usr/bin/perl =head1 DESCRIPTION View random images from the supplied folder (supports . and ~). Every time you close an image a new random image will open, until the program is stopped. Inspired by "Re^2: Tk show image from web" by IB2017 https://www.perlmonks.org/index.pl?node_id=11108799 =cut use strict; use warnings; use autodie; use File::Spec; use MIME::Base64; use Tk; use Tk::Photo; use Tk::JPEG; use Tk::PNG; my $dir = shift || die "Usage: $0 /path/to/images"; die 'Folder not found :-(' unless -d $dir; opendir my $dh, glob $dir; my @img = grep /\.(jpe?g|gif|png|bmp)/i, readdir $dh; closedir $dh; die 'No images found, try again!' unless @img; while () { my $img = $img[rand@img]; my $path = File::Spec->catfile($dir,$img); open my $fh, '<', $path; my $dat = join '', <$fh>; close $fh; $dat = MIME::Base64::encode_base64($dat); print "$path \n"; my $mw = MainWindow->new; my $top = $mw->Frame()->pack(); my $image = $mw->Photo(-data => $dat); my $label = $top->Label(-image => $image)->pack(); MainLoop }
        Dear Monks,

        I like to use this program to surf images in my huge downloads folder, but it has 2 problems:

        The first issue is that memory use grows with each image since it doesn't call the delete method on the $image (as Tk::Image says) but I can't figure out where to call this method without causing a segmentation fault.

        The second issue is that Tk::JPEG fails with "Unsupported JPEG color space" on CMYK images. Do I have to use Image::Info to detect CMYK and Imager to convert to RGB or is there a simpler way?

        Thank you

      The wikipedia lookup doesn't work for me so I changed 1 line to make it load any image or a default image:
      my $urlImage= getWikiImage($QueryString) || shift || 'https://covers.oreillystatic.com/images/9780596000271/lrg.jpg';

Log In?
Username:
Password:

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

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

    No recent polls found