Self-reply:

I just noticed the #displayJpegInMorph method below is garbage and can be ignored.

Also, I believe there is a higher-level abstraction above JPEGReadWriter2.  If I recall correctly, this higher level abstraction is connected to the Services architecture and can display many different formats of image files from disk.  I didn't dig into it much and could be mistaken, but with further research it could prove useful.

Thanks again,
Tim J



On Apr 2, 2019, at 8:15 AM, Tim Johnson <digit@sonic.net> wrote:

Hi Hannes,

I have implemented this in various ways in my InternetArchive client library—a work in (slow) progress over the last 3+ years.  Note I did not realize a similar library had been written for Sophie ten years ago.  This one was based on the Python client library which uses the current InternetArchive API.

I finally made it public in its current state here: 


Some examples for how to use it live in the IAExample* classes.  

The following will display the famous Byte cover and restore the display after a click:

(IAItem named: 'byte-magazine-1981-08' ) displayItemTileJpeg

Anyway, you can find my code in the 'displaying graphics' instance method category of IADownload.   Also note that you may be interested in seeing Form class>>#openImageInWindow:

Here is how I implemented some JPEG download & display in Squeak 5.2.  These methods are taken from the IADownload and perhaps IAItem classes.

getResponse
"returns a WebResponse object"
^ response := WebClient httpGet: self url.

downloadJpegIntoForm
| s contents jww imageExtent form | 
s := ByteArray new writeStream.
s binary.
self getResponse.
response streamTo: s size: response contentLength progress: nil.
response close.
contents := s contents.
(JPEGReadWriter2 understandsImageFormat: (contents readStream))
ifFalse: [^ self error: 'cannot read jpeg'].
jww := JPEGReadWriter2 new.
imageExtent := jww imageExtent: contents.
form := Form extent: imageExtent depth: 32.
jww uncompress: contents into: form doDithering: false.
^ form

displayJpeg
| form | 
form := self downloadJpegIntoForm.
Display restoreAfter: [ form displayOn: Display ].


displayJpegInMorph
| form morph | 
form := self downloadJpegIntoForm.
morph := BorderedMorph newBounds: (form bounds). 
Display restoreAfter: [ form displayOn: Display ].


displayJpegInWindow
| form morph window | 
self flag: #seeFormClassSideForUtilityMethod.
form := self downloadJpegIntoForm.
morph := form asMorph.

window := SystemWindow labelled: 'image'.
window 
" addMorphCentered: (form asMorph);"
addMorph: (form asMorph) frame: (0.0@0.0 corner: 1.0@1.0) .
" addMorph: (form asMorph) fullFrame: (SystemWindow menuBoxFrame) ."
window 
openInWorldExtent: (form extent scaleBy: 1.2 @ 1.2).



Let me know if I can help further.  I believe there is also code in there for displaying downloaded GIFs and animated GIFs but I could be wrong.

Best,
Tim






On Mar 21, 2019, at 3:51 AM, H. Hirzel <hannes.hirzel@gmail.com> wrote:

Hello

What is a good modern way in Squeak to load a picture from the web?

I am looking for an equivalent of

| pngPicURL aStream |

pngPicURL := 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Squeak-x11.png/617px-Squeak-x11.png'.

aStream := HTTPSocket httpGet: pngPicURL.

(ImageReadWriter formFromStream: aStream) asMorph openInHand

And answer or just comments are welcome.

Thank you.

Kind regards

Hannes