http://www.perlmonks.org?node_id=1031124


in reply to Re: wxPerl: is BitmapFromImage implemented?
in thread wxPerl: is BitmapFromImage implemented?

Thank you, James. This is great - it's working fine. You did a great job of deciphering hieroglyphics.

Now the image shows great, but when you resize the window, it "crops" the image - it displays only the image part which is covered by the window (in other words, it does not compress the image size so that regardless of the actual window size, the entire image will always be shown).

Can you suggest how to do it? (I could set up a resize event, and then in the event handler subroutine, change the image size and re-display, but this sounds a bit like a kludge, it there an automatic way to do it?)

Many TIA - Helen

(Running DWIM Perl 5.14.2 on Windows 7 and WinXP SP 3)

  • Comment on Re^2: wxPerl: is BitmapFromImage implemented?

Replies are listed 'Best First'.
Re^3: wxPerl: is BitmapFromImage implemented?
by jmlynesjr (Deacon) on Apr 29, 2013 at 15:09 UTC

    Helen, good question...

    No idea off hand. Seems I read about sizers that the control "communicates" a minimum size to the sizer process. Maybe there is a clue there. Most of the documentation refers to stretching controls not compressing them. Your "kludge" may be the way to go, at least until another idea surfaces.

    Once again from the wxBook(well worth $38 to Amazon):

    "(Sizers)...It is based upon the idea of individual windows reporting their minimal required size and their ability to be stretched if the size of the parent window has changed. This will most often mean that the programmer does not set the initial size of the dialog; instead, the dialog will be assigned a sizer, which will be queried about the recommended size....The minimal size of a control is calculated from the control's notion of it's "best size"(supplied by implementing DoGetBestSize for each control)....However, if you want the initial window size(as passed to the window's constructor) to be used as the initial minimum size instead, you can use the wxFIXED_MINSIZE style when adding the control to the sizer. Note that only some windows can calculate their size....whereas others....don't have any natural width or height and thus require an explicit size."

    Update1: The Wx::Image::Rescale seems to work. Try a subset of this in your resize event handler. Two scaling qualities are supported: wxIMAGE_QUALITY_NORMAL and wxIMAGE_QUALITY_HIGH(better quality but slower).

    Wx::InitAllImageHandlers; $img = Wx::Image->new($parms{image_fname}, wxBITMAP_TYPE_ANY); my $h = $img->GetHeight; my $w = $img->GetWidth; $img->Rescale($w-150, $h-50); my $bmp = Wx::Bitmap->new($img); $sb = Wx::StaticBitmap->new($panel, -1, $bmp);

    Update2: Fixed a typo.

    Update3: Seems you may want to scale from the original Wx::Image each time to avoid compounding any scaling artifacts/losses of resolution.

    James

    There's never enough time to do it right, but always enough time to do it over...