Ponty
Ponty

Reputation: 645

Gwt Image original size

I use an Image object to load a png image as a thumbnail by calling its setPixelSize() method to resize the image. I also need to retrieve the original size of the image as integers at some point. How can I get the original sizes (width, height) of the image?

ok i found a workaround: I use a dummy container (SimplePanel) and load the image without scaling save its real dimensions and then remove the container from the parent and discard the new Image object. I don't know if this a good workaround, but it works. Although i would like to know if there is another way...

problem of the workaround: I have a droplist from which i can select logical folders (which contain images). When i select a new folder, and the new set of images is loaded on display, then i get 0 for width and 0 for height.

private void getTrueSize(String fullUrl) {
        Image trueImage = new Image();
        this.tstCon.add(trueImage);
        trueImage.setUrl(fullUrl);
        this.trueHeight = trueImage.getHeight();
        this.trueWidth = trueImage.getWidth();
        //this.tstCon.remove(trueImage);
        //trueImage = null;
        GWT.log("Image [" + this.imgTitle + "] -> height=" + this.trueHeight + " -> width=" + this.trueWidth);//
    }

Upvotes: 2

Views: 2337

Answers (3)

foal
foal

Reputation: 731

Read naturalHeight and naturalWidth of the image element after image load.

    public Panel() {
        image = new Image();
        image.addLoadHandler(this::onLoad);
    }

    private void onLoad(@SuppressWarnings("unused") LoadEvent event) {
        origImageWidth = getNaturalWidth(image);
        origImageHeight = getNaturalHeight(image);
    }

    private static int getNaturalHeight(Image img) {
        return img.getElement().getPropertyInt("naturalHeight"); //$NON-NLS-1$
    }

    private static int getNaturalWidth(Image img) {
        return img.getElement().getPropertyInt("naturalWidth"); //$NON-NLS-1$
    }


Upvotes: 0

pistolPanties
pistolPanties

Reputation: 1890

Extend the Image class and implement onAttach() method. This method is called when a widget is attached to the browser's document.

public class Thumb extends Image {

    public Thumb(){
        super();
    }

    protected void onAttach(){
        Window.alert(getOffsetHeight()+" "+getOffsetWidth()); //this should give you the original value
        setPixelSize(10,10); // this should be the visible value 
        super.onAttach();
    }
}

if this doesn't work, try implementing onLoad() instead of onAttach(), since onLoad() will be called after the image is added to DOM so that it definately should work.

Upvotes: 1

Andreas Köberle
Andreas Köberle

Reputation: 111032

Its the easiest way to create a new hidden Image (placed absolute outside the viewport) and read the size. There is a JavaScript lib that can read the exif data of the image but this would be overkill in this case.

Upvotes: 0

Related Questions