NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Chris, Thanks for the feedback, and good to hear that ImageFlatField works for someone other than me. I am still planning a few improvements to it, but have been too busy with other things lately. Hopefully I'll find time later this spring. Cheers, Curtis On Tue, Feb 12, 2008 at 1:30 PM, Christian Schill < christian.schill@xxxxxxxxxxxxxxxxxxxxx> wrote: > Hi Curtis, hi all, > > perhaps you remember the problem we discussed in October '07 (yew, time is > fleeting - how to read > images from a WMS into a flatfield) -- finally we found the time to use > your suggestions and > everything worked fine. Thanks a lot. Just one small addition to your > "makeBuffered()"-method (see > below). > > [..] > > I have put some work into an alternative type of FlatField for images > > that is more efficient called ImageFlatField. You could give it a try: > > just construct a new ImageFlatField object around your > > java.awt.image.BufferedImage object and use the resulting object the > > same as you would a normal FlatField. > [..] > > See Test73 for an example of usage. > [..] > > If your java.awt.Image is not a BufferedImage, you can convert it into > > one with code like this: > > > > public static BufferedImage makeBuffered(Image image) { > > if (image instanceof BufferedImage) return (BufferedImage) image; > > BufferedImage img = new BufferedImage(image.getWidth(this), > > image.getHeight(this), BufferedImage.TYPE_INT_RGB); > > // or TYPE_BYTE_GRAY or whatever is appropriate > > Graphics g = img.getGraphics(); > > g.drawImage(image, 0, 0, this); > > g.dispose(); > > return img; > > } > > > The parameters of the drawImage() method are > drawImage(Image img, int x, int y, ImageObserver observer) > > with ImageObserver being an interface that is implemented by the class > Component. > So one can use "this" if the call to drawImage() is within a class that is > derived from Component. > Otherwise, if your class isn't derived from Component one can call > drawImage() with null. > > g.drawImage() returns TRUE if pixel values don't change any more (image > completely loaded) and > false otherwise. If you retrieve images from a server it might be useful > to wait until the image > has been read completely with > > while (!g.drawImage(image, 0, 0, null)); > > before disposing with g.dispose(). > (at least this did the trick for us and perhaps this might be useful for > others). So our method > finally is > ------------------------------------------------------ > public BufferedImage makeBuffered(Image image, int width, int height) { > if (image instanceof BufferedImage) return (BufferedImage) image; > BufferedImage img = new BufferedImage(width, height, > bufferedImage.TYPE_BYTE_GRAY); > // or TYPE_BYTE_GRAY or whatever is appropriate > Graphics g = img.getGraphics(); > while (!g.drawImage(image, 0, 0, null)); > g.dispose(); > return img; > } > ------------------------------------------------------ > > I'm sure one can do some useful extensions (e.g. if you are using an > ImageObserver I think > int checkImage(Image, ImageObserver) > and > boolean prepareImage(Image, ImageObserver) > > might be worth looking at, also at a timeout in the while loop (of > course), but at the moment this > is ok for us. > > Thanks again and greetings! > > Chris >
visad
archives: